home *** CD-ROM | disk | FTP | other *** search
Text File | 1999-03-11 | 128.1 KB | 3,216 lines |
- OPT PREPROCESS,OSVERSION=37,LARGE
-
- /* This source-code was not intended to be made public, so forgive mysterious (and French) comments...
-
- Also, it was the first program I ever wrote with AmigaE and with MUI, so there are many parts that
- aren't well written.*/
-
- MODULE 'muimaster','libraries/tmui','libraries/muip','mui/muicustomclass',
- 'intuition/classes','intuition/classusr','intuition/intuition',
- 'utility/tagitem','utility/hooks',
- 'amigalib/boopsi',
- 'libraries/gadtools','libraries/asl',
- 'tools/longreal','tools/mathtermd',
- '*convertorlocale',
- 'cyclearray',
- 'afc/tooltype'
-
- #define PROGNAME 'Convertor 2.79'
- #define PROGVER '$VER: Convertor 2.79 (08/01/99)'
-
- #define _returnid(id) doMethodA(app,[MUIM_Application_ReturnID,id])
-
- OBJECT myreal
- a,b /* Pour lire les attribus privés de longreal... :-þ */
- ENDOBJECT
- OBJECT base
- type
- name
- value:longreal
- zero:longreal
- ENDOBJECT
- OBJECT prefix
- name
- exp:longreal
- ENDOBJECT
- OBJECT group
- list:PTR TO LONG
- title:PTR TO CHAR
- sze
- ENDOBJECT
- OBJECT composed
- base:PTR TO LONG -> en fait «PTR TO (PTR TO CHAR)» :-)
- pfx:PTR TO LONG
- expo:PTR TO LONG
- sze
- ENDOBJECT
- OBJECT undonode /*ce qui doit être sauvé*/
- v1:PTR TO longreal,v2:PTR TO longreal
- u1:PTR TO composed,u2:PTR TO composed
- ENDOBJECT
- OBJECT sstring_data
- empty:CHAR
- ENDOBJECT
- OBJECT droplist_data
- empty:CHAR
- ENDOBJECT
- ENUM SR_ALPHA=1,SR_NUMERIC
- ENUM OP_MUL=1,OP_DIV,OP_REPL
- ENUM OBJ_COMPF=1,OBJ_BASEF,OBJ_COMPL
- CONST PFX_ORIGINAL=99, OLDC=1,NEWC=2
- ENUM DR_LEFT=1,DR_CURR,DR_RIGHT,DR_UNIVERSAL
-
- DEF running,result
- DEF ldtxt,app=NIL,window=NIL,sigs=0,
- lvt_pfx:PTR TO LONG, -> "Liste des préfixes"
- ug, ud, /*Unités */
- vg, vd /*Valeurs*/
- DEF bt_a,bt_b,bt_c, accu,
- ld
- DEF cat:PTR TO catalog_convertor /*Localisation*/
- DEF lv_groups,lv_pfx,lv_units /*List views*/
- DEF l_groups ,l_pfx ,l_units, /*Lists */
- str[50]:STRING,q:PTR TO CHAR,r[50]:STRING,
- handler,oldstdout,gptr:PTR TO group,
- statusu,bases[300]:ARRAY OF LONG,bptr:PTR TO base,ptr:PTR TO composed,groups[50]:ARRAY OF LONG,glen,
- pref[21]:ARRAY OF prefix,si[20]:ARRAY OF LONG,nsi,
- nbases,
- line,i,n,nunits,
- value1:longreal,unit1:PTR TO composed,fact1:longreal,zero1:longreal,type1[20]:STRING,
- value2:longreal,unit2:PTR TO composed,fact2:longreal,zero2:longreal,type2[20]:STRING,
- undef1=FALSE,undef2=FALSE,
- undo=NIL:PTR TO cyclearray,current,un:PTR TO undonode,
- cur,z,o,
- s:longreal,t:longreal,ten:longreal,
- a:PTR TO CHAR,b:PTR TO CHAR,longstr[600]:STRING,
- basegroup=FALSE,noconvert=FALSE,
- bubbles=FALSE,g1,g2,g3,
- menu,filereq:PTR TO filerequester,
- ttype=NIL:PTR TO tooltype,undosteps=20
-
- DEF strwin,strstr,strarg,strarg2
-
- DEF cont:PTR TO group
-
- DEF cl_sstring =NIL: PTR TO mui_customclass, /*classes*/
- cl_droplist=NIL: PTR TO mui_customclass
-
- ENUM ID_ABOUT=1,ID_MABOUT,ID_HIDE,ID_RESET,ID_PREFS,ID_HCONT,ID_HSBC,ID_BUBBLES,/*General&Help*/
- ID_UNICALC,ID_CALC,ID_UNDO,ID_REDO,ID_SICONVERT,ID_INVERSE,ID_SHOWFORMULA, /*Tools*/
- ID_MNU_NOCONVERT,ID_MNU_ADD,ID_MNU_SUBSTR,ID_SWITCH,
- ID_CALCL,ID_CALCR,ID_LEFTU,ID_RIGHTU,ID_OPENG,ID_READU,ID_WRITE, /*Unités*/
- ID_SETLEFT,ID_SETRIGHT, /*COTE*/
- ID_STRDONE,ID_GRENAME,ID_BRENAME,ID_SETZERO,ID_UDSAVE,ID_CRENAME, /*UNITDATA*/
- ID_SADD,ID_GADD,ID_BADD,ID_CADD,ID_CDEL,ID_BDEL,ID_GDEL,ID_GSORT,
- ID_ASORT,ID_NSORT,ID_RSORT,
- ID_ABOUTUD,ID_LOADUD,ID_LOADFROM,ID_SAVEAS,ID_NEWUD
-
- ENUM ER_NOUD=1,ER_EMUD,ER_BADUD,ER_BADFORMAT,ER_NOCLASSES,ER_ASL,ER_LOC,ER_MATH
- DEF point:PTR TO CHAR
- ENUM GROUP=1,BASE,COMPOSED,NUMERIC
-
- /****************************************************************************/
- /* sString class */
- /****************************************************************************/
-
- PROC sstring_dragquery(/*cl:PTR TO iclass,*/obj:PTR TO object,msg:PTR TO muip_dragdrop)
- DEF dat1,dat2
- /*msg.obj:Source du drag;obj:destination, fait avec cette classe*/
- dat1:=muiUserData(msg.obj)
- dat2:=muiUserData(obj)
- IF msg.obj=obj -> Il ne faut pas "draguer" un String sur lui-même.
- RETURN (MUIV_DragQuery_Refuse)
- ELSEIF (dat1=dat2) OR ((dat2=OBJ_COMPF) AND (dat1=OBJ_COMPL))
- RETURN (MUIV_DragQuery_Accept)
- ELSE
- RETURN (MUIV_DragQuery_Refuse)
- ENDIF
- ENDPROC
-
- PROC sstring_dragdrop(/*cl:PTR TO iclass,*/obj,msg:PTR TO muip_dragdrop)
- DEF entry,dat
- dat:=muiUserData(msg.obj)
- IF dat = OBJ_COMPL /*1) from a droplist.mcc to an sString*/
- IF obj=ud
- readu(TRUE)
- ELSE
- readu(FALSE)
- ENDIF
- convert()
- ELSE /*2) from an sString to another:*/
- mget(msg.obj,MUIA_String_Contents,{entry})
- set(obj,MUIA_String_Contents,entry)
- IF obj=ug
- unit1.copycomp(unit2)
- dCopy(fact1,fact2)
- dCopy(zero1,zero2)
- StrCopy(type1,type2)
- ELSE
- unit2.copycomp(unit1)
- dCopy(fact2,fact2)
- dCopy(zero2,zero1)
- StrCopy(type1,type2)
- ENDIF
- convert()
- ENDIF
- savelast()
- ENDPROC 0
-
- PROC sstring_dispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
- DEF methodid /*I removed the cl args just to avoid having an "Unreferenced" message*/
- methodid:=msg.methodid
- SELECT methodid
- CASE MUIM_DragQuery; RETURN (sstring_dragquery(/*cl,*/obj,msg))
- CASE MUIM_DragDrop ; RETURN (sstring_dragdrop (/*cl,*/obj,msg))
- ENDSELECT
- ENDPROC (doSuperMethodA(cl,obj,msg))
-
- /****************************************************************************/
- /* DropList class */
- /****************************************************************************/
-
- PROC droplist_dragquery(cl:PTR TO iclass,obj:PTR TO object,msg:PTR TO muip_dragdrop)
-
- IF (msg.obj=obj)
- IF obj=l_groups
- mget(obj,MUIA_List_Active,{cur})
- IF cur=(glen+1)
- RETURN (MUIV_DragQuery_Refuse)
- ENDIF
- /*mget(obj,MUIA_List_DropMark,{cur})
- IF cur=(glen+2)
- RETURN (MUIV_DragQuery_Refuse)
- ENDIF*/
- ENDIF
- RETURN (doSuperMethodA(cl,obj,msg))
- ELSEIF (muiUserData(msg.obj)<>0) AND (obj <> l_groups)
- RETURN (MUIV_DragQuery_Accept)
- ELSE
- RETURN (MUIV_DragQuery_Refuse)
- ENDIF
- ENDPROC
-
- PROC droplist_dragdrop(cl:PTR TO iclass,obj,msg:PTR TO muip_dragdrop)
- DEF dropmark,j,bb,bbb,ls:PTR TO LONG
-
- mget(obj,MUIA_List_DropMark,{dropmark})
-
- IF (msg.obj=obj)
- mget(obj,MUIA_List_Active,{i}) /*du i au dropmark*/
- IF (dropmark <> i) AND (dropmark <> (i+1)) -> vrai déplacement?
- IF obj=l_groups
- IF dropmark < i
- bb:=groups[dropmark]
- FOR j:=dropmark+1 TO i
- bbb:=groups[j]
- groups[j]:=bb
- bb:=bbb
- ENDFOR
- groups[dropmark]:=bb
- ELSE
- IF dropmark=(glen+2) -> after Base -> move it back
- doMethodA(obj,[MUIM_List_Move,dropmark-1,i])
- set(obj,MUIA_List_Active,i)
- ELSE
- dropmark:=dropmark-1
- bb:=groups[i]
- FOR j:=i TO (dropmark-1)
- groups[j]:=groups[j+1]
- ENDFOR
- groups[dropmark]:=bb
- ENDIF
- ENDIF
- ELSE
- mget(l_groups,MUIA_List_Active,{cur})
- IF basegroup
- IF dropmark<i /*montée*/
- bb:=bases[dropmark]
- FOR j:=dropmark+1 TO i
- bbb:=bases[j]
- bases[j]:=bb
- bb:=bbb
- ENDFOR /* Montée Descente */
- bases[dropmark]:=bb /* 1 1 1 1 */
- /* 2 * 5 drp 2 / 3 i */
- ELSE /*Descente*/ /* 3 \ 2 d+1 3 / 4 */
- dropmark:=dropmark-1 /* 4 \ 3 4 / 5 */
- bb:=bases[i] /* 5 \ 4 i 5 * 2 drp */
- FOR j:=i TO (dropmark-1) /* 6 6 6 6 */
- bases[j]:=bases[j+1]
- ENDFOR
- bases[dropmark]:=bb
- ENDIF
- ELSE
- gptr:=groups[cur]
- ls:=gptr.list
- IF dropmark<i /*montée*/
- bb:=ls[dropmark]
- FOR j:=dropmark+1 TO i
- bbb:=ls[j]
- ls[j]:=bb
- bb:=bbb
- ENDFOR
- ls[dropmark]:=bb
-
- ELSE /*Descente*/
- dropmark:=dropmark-1 -> Dropmark serait-il décalé?
- bb:=ls[i]
- FOR j:=i TO (dropmark-1)
- ls[j]:=ls[j+1]
- ENDFOR
- ls[dropmark]:=bb
- ENDIF
- ENDIF
- ENDIF
- RETURN (doSuperMethodA(cl,obj,msg))
- ENDIF
- ELSE
-
- mget(l_groups,MUIA_List_Active,{cur})
-
- IF msg.obj=vg
- askstr(cat.msgBaseName.getstr(),'',BASE)
- strarg:=dropmark;i:=FALSE
- strarg2:=TRUE
- ELSEIF msg.obj=vd
- askstr(cat.msgBaseName.getstr(),'',BASE)
- strarg:=dropmark;i:=FALSE
- strarg2:=FALSE
- ELSEIF msg.obj=ug
- IF basegroup
- Mui_RequestA(app,window,0,cat.msgCompVsBgT.getstr(),NIL,cat.msgCompVsBg.getstr(),NIL)
- ELSE
- addcomp(cur,unit1,dropmark)
- ENDIF
- ELSEIF msg.obj=ud
- IF basegroup
- Mui_RequestA(app,window,0,cat.msgCompVsBgT.getstr(),NIL,cat.msgCompVsBg.getstr(),NIL)
- ELSE
- addcomp(cur,unit2,dropmark)
- ENDIF
- ENDIF
-
- ENDIF
- ENDPROC 0
-
- PROC droplist_dispatcher(cl:PTR TO iclass,obj,msg:PTR TO msg)
- DEF methodid
- methodid:=msg.methodid
- SELECT methodid
- CASE MUIM_DragQuery; RETURN (droplist_dragquery(cl,obj,msg))
- CASE MUIM_DragDrop ; RETURN (droplist_dragdrop (cl,obj,msg))
- ENDSELECT
- ENDPROC (doSuperMethodA(cl,obj,msg))
-
- PROC exitclasses()
- IF (cl_sstring ) THEN Mui_DeleteCustomClass(cl_sstring)
- IF (cl_droplist) THEN Mui_DeleteCustomClass(cl_droplist)
- ENDPROC
-
- PROC initclasses()
- cl_sstring:= eMui_CreateCustomClass(NIL,MUIC_String,NIL,SIZEOF sstring_data,{sstring_dispatcher})
- cl_droplist:=eMui_CreateCustomClass(NIL,MUIC_List,NIL,SIZEOF droplist_data,{droplist_dispatcher})
- IF (cl_sstring AND cl_droplist) THEN RETURN TRUE
- exitclasses()
- ENDPROC FALSE
-
- /****************************************************************************
- * Main Program *
- ****************************************************************************/
-
- PROC main() HANDLE
-
- localebase:=OpenLibrary('locale.library',0)
- IF localebase=NIL
- Raise(ER_LOC)
- ENDIF
- NEW cat.create()
- cat.open()
-
- ldtxt:=[cat.msgLevel.getstr(),cat.msgDifference.getstr(),NIL]
-
- NEW ttype.tooltype()
-
- z:=Open('Convertor2.7.info',OLDFILE)
- IF z -> IF the icons exists...
- Close(z)
- ttype.grab('Convertor2.7')
- z:=ttype.get('UNDOSTEPS')
- IF z THEN undosteps:=Val(z)
- ENDIF
- dInit()
- mtdInit(ER_MATH)
-
- NEW unit1
- NEW unit2
- unit1.base:=String(5)
- unit2.base:=String(5)
-
- NEW undo.cyclearray(undosteps)
- FOR i:=0 TO undosteps-1
- undo.setitem(i,NIL)
- ENDFOR
- current:=undosteps-1
- -> NM_ITEM,0,"Texte","raccourci",opt,(multiple exclusivité),action (voir boucle en bas)
-
- menu:= [
- NM_TITLE,0,cat.msgGeneral.getstr(),0,0,0,0,
- NM_ITEM, 0, cat.msgAbout.getstr(), '?', 0, 0, ID_ABOUT,
- NM_ITEM, 0, cat.msgAboutMui.getstr(), '''',0, 0, ID_MABOUT,
- NM_ITEM, 0, cat.msgMuiPrefs.getstr(), 'P', 0, 0, ID_PREFS,
- NM_ITEM, 0, NM_BARLABEL, 0, 0, 0, 0,
- NM_ITEM, 0, cat.msgHide.getstr(), 'Z', 0, 0, ID_HIDE,
- NM_ITEM, 0, cat.msgReset.getstr(), 'W', 0, 0, ID_RESET,
- NM_ITEM, 0, cat.msgQuit.getstr(), 'Q', 0, 0, MUIV_Application_ReturnID_Quit,
-
- NM_TITLE,0,cat.msgTools.getstr(),0,0,0,0,
- NM_ITEM, 0, cat.msgConvert.getstr(), 'C', 0, 0, ID_UNICALC,
- NM_ITEM, 0, cat.msgUnDo.getstr(), 'K', 0, 0, ID_UNDO,
- NM_ITEM, 0, cat.msgReDo.getstr(), 'R', 0, 0, ID_REDO,
- NM_ITEM, 0, cat.msgConvertSI.getstr(), '&', 0, 0, ID_SICONVERT,
- NM_ITEM, 0, cat.msgInverse.getstr(), '/', 0, 0, ID_INVERSE,
- NM_ITEM, 0, cat.msgShowFormula.getstr(),'=',0, 0, ID_SHOWFORMULA,
- NM_ITEM, 0, cat.msgSwitch.getstr(), 0, 0, 0, ID_SWITCH,
- NM_ITEM, 0, NM_BARLABEL, 0, 0, 0, 0,
- NM_ITEM, 0,cat.msgNoConversion.getstr(),'B',CHECKIT,0,ID_MNU_NOCONVERT,
- NM_ITEM, 0, cat.msgPlus.getstr(), '+', 0, 0, ID_MNU_ADD,
- NM_ITEM, 0, cat.msgSubstr.getstr(), '-', 0, 0, ID_MNU_SUBSTR,
-
- NM_TITLE,0,cat.msgUnitData.getstr(),0,0,0,0,
- NM_ITEM, 0, cat.msgSI.getstr(), 0, 0, 0, 0,
- NM_SUB,0,cat.msgAddSI.getstr(), 0, 0, 0, ID_SADD,
- NM_ITEM, 0, cat.msgBase.getstr(), 0, 0, 0, 0,
- NM_SUB,0,cat.msgAddB.getstr(), 0, 0, 0, ID_BADD,
- NM_SUB,0,cat.msgDeleteB.getstr(), 0, 0, 0, ID_BDEL,
- NM_SUB,0,cat.msgSetZero.getstr(), 0, 0, 0, ID_SETZERO,
- NM_SUB,0,cat.msgRenameB.getstr(), 0, 0, 0, ID_BRENAME,
- NM_ITEM, 0, cat.msgComposed.getstr(), 0, 0, 0, 0,
- NM_SUB,0,cat.msgAddC.getstr(), 0, 0, 0, ID_CADD,
- NM_SUB,0,cat.msgDeleteC.getstr(), 0, 0, 0, ID_CDEL,
- NM_SUB,0,cat.msgRenameC.getstr(), 0, 0, 0, ID_CRENAME,
- NM_ITEM, 0, cat.msgGroup.getstr(), 0, 0, 0, 0,
-
- NM_SUB,0,cat.msgAddG.getstr(), 0, 0, 0, ID_GADD,
- NM_SUB,0,cat.msgDeleteG.getstr(), 0, 0, 0, ID_GDEL,
- NM_SUB,0,cat.msgRenameG.getstr(), 0, 0, 0, ID_GRENAME,
- NM_SUB,0,cat.msgSortGroups.getstr(), 'G', 0, 0, ID_GSORT,
- NM_ITEM, 0, cat.msgSort.getstr(), 0, 0, 0, 0,
- NM_SUB,0,cat.msgAlphabetically.getstr(),'F',0, 0, ID_ASORT,
- NM_SUB,0,cat.msgNumerically.getstr(),'M', 0, 0, ID_NSORT,
- NM_SUB,0,cat.msgReverse.getstr(), 'X', 0, 0, ID_RSORT,
- NM_ITEM, 0, NM_BARLABEL, 0, 0, 0, 0,
- NM_ITEM, 0, cat.msgNew.getstr(), 'N', 0, 0, ID_NEWUD,
- NM_ITEM, 0, cat.msgLoad.getstr(), 'L', 0, 0, ID_LOADUD,
- NM_ITEM, 0, cat.msgLoadFrom.getstr(), 'O', 0, 0, ID_LOADFROM,
- NM_ITEM, 0, cat.msgSave.getstr(), 'S', 0, 0, ID_UDSAVE,
- NM_ITEM, 0, cat.msgSaveAs.getstr(), 'A', 0, 0, ID_SAVEAS,
- NM_ITEM, 0, cat.msgAboutUDT.getstr(), 'U', 0, 0, ID_ABOUTUD,
-
- NM_TITLE,0,cat.msgHelp.getstr(),0,0,0,0,
- NM_ITEM, 0, cat.msgHelpContents.getstr(),'H',0, 0, ID_HCONT,
- NM_ITEM, 0, cat.msgSBC.getstr(), 'T',0, 0, ID_HSBC,
- NM_ITEM, 0, cat.msgHelpBubbles.getstr(), 'I',CHECKIT,0,ID_BUBBLES,
-
- NM_END,0,NIL,0,0,0,0]:newmenu
-
- muimasterbase:=OpenLibrary(MUIMASTER_NAME,MUIMASTER_VMIN)
- IF muimasterbase <> NIL
-
- IF initclasses()=NIL THEN
- Raise(ER_NOCLASSES)
-
- lvt_pfx:=['Y (+24)','Z (+21)',
- 'E (+18)','P (+15)',
- 'T (+12)','G (+9)',
- 'M (+6)','K (+3)',
- 'H (+2)','Da (+1)',
- cat.msgOriginal.getstr(),
- ' (0)','d (-1)',
- 'c (-2)','m (-3)',
- 'µ (-6)','n (-9)',
- 'p (-12)','f (-15)',
- 'a (-18)','z (-21)',
- 'y (-24)', NIL]
-
- app:=appstruct()
-
- IF app<>NIL
- set(ug,MUIA_UserData,OBJ_COMPF)
- set(ud,MUIA_UserData,OBJ_COMPF)
- set(vg,MUIA_UserData,OBJ_BASEF)
- set(vd,MUIA_UserData,OBJ_BASEF)
- set(l_units,MUIA_UserData,OBJ_COMPL)
-
- initC()
- loadud()
-
- /*Close windows*/
- doMethodA(window,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,app,2,MUIM_Application_ReturnID,MUIV_Application_ReturnID_Quit])
- doMethodA(strwin,[MUIM_Notify,MUIA_Window_CloseRequest,MUI_TRUE,strwin,3,MUIM_Set,MUIA_Window_Open,FALSE])
- doMethodA(strstr,[MUIM_Notify,MUIA_String_Acknowledge, MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_STRDONE])
- /*×÷= buttons*/
- doMethodA(bt_a, [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_b,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
- doMethodA(bt_a, [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_c,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
- doMethodA(bt_b, [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_a,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
- doMethodA(bt_b, [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_c,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
- doMethodA(bt_c, [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_a,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
- doMethodA(bt_c, [MUIM_Notify,MUIA_Selected,MUI_TRUE,bt_b,3,MUIM_NoNotifySet,MUIA_Selected,FALSE])
- doMethodA(bt_a, [MUIM_Notify,MUIA_Selected,FALSE,bt_a,3,MUIM_NoNotifySet,MUIA_Selected,MUI_TRUE])
- doMethodA(bt_b, [MUIM_Notify,MUIA_Selected,FALSE,bt_b,3,MUIM_NoNotifySet,MUIA_Selected,MUI_TRUE])
- doMethodA(bt_c, [MUIM_Notify,MUIA_Selected,FALSE,bt_c,3,MUIM_NoNotifySet,MUIA_Selected,MUI_TRUE])
- /*Cycle Chain*/
- doMethodA(window, [MUIM_Window_SetCycleChain, ug,ud,vg,vd,bt_a,bt_b,bt_c,accu,ld,lv_groups,lv_pfx,lv_units,NIL])
- /*Strings, Slider, Radio..*/
- doMethodA(ug, [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_LEFTU])
- doMethodA(ud, [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_RIGHTU])
- doMethodA(vg, [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CALCR])
- doMethodA(vd, [MUIM_Notify,MUIA_String_Contents,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CALCL])
- doMethodA(vg, [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_WRITE])
- doMethodA(vd, [MUIM_Notify,MUIA_String_Acknowledge,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_WRITE])
- doMethodA(accu, [MUIM_Notify,MUIA_Slider_Level,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CALC])
- doMethodA(ld, [MUIM_Notify,MUIA_Radio_Active,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_CALC])
- /*lists*/
- doMethodA(l_groups,[MUIM_Notify,MUIA_List_Active,MUIV_EveryTime,app,2,MUIM_Application_ReturnID,ID_OPENG])
- doMethodA(lv_units,[MUIM_Notify,MUIA_Listview_DoubleClick,MUI_TRUE,app,2,MUIM_Application_ReturnID,ID_READU])
- /*shortkeys*/
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'space', app,2,MUIM_Application_ReturnID,ID_SWITCH])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'s', app,2,MUIM_Application_ReturnID,ID_SADD])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'b', app,2,MUIM_Application_ReturnID,ID_BADD])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'control b',app,2,MUIM_Application_ReturnID,ID_BDEL])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'shift b', app,2,MUIM_Application_ReturnID,ID_BRENAME])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'alt b', app,2,MUIM_Application_ReturnID,ID_SETZERO])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'c', app,2,MUIM_Application_ReturnID,ID_CADD])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'control c',app,2,MUIM_Application_ReturnID,ID_CDEL])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'shift c', app,2,MUIM_Application_ReturnID,ID_CRENAME])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'g', app,2,MUIM_Application_ReturnID,ID_GADD])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'control g',app,2,MUIM_Application_ReturnID,ID_GDEL])
- doMethodA(window,[MUIM_Notify,MUIA_Window_InputEvent,'shift g', app,2,MUIM_Application_ReturnID,ID_GRENAME])
-
- set(l_pfx,MUIA_List_Active,10)
- set(l_groups,MUIA_List_Active,0)
-
- set(window,MUIA_Window_Open,MUI_TRUE)
-
- running := TRUE
-
- WHILE running
- result:= doMethodA(app, [MUIM_Application_Input,{sigs} ])
-
- SELECT result
- CASE MUIV_Application_ReturnID_Quit
- running:=FALSE
- CASE ID_MNU_NOCONVERT
- noconvert:=1-noconvert
- IF noconvert THEN convert()
- CASE ID_MNU_ADD
- mget(vd,MUIA_String_Contents,{a})
- undef2:=supera2d(a,value2)
- mget(vg,MUIA_String_Contents,{a})
- undef1:=supera2d(a,value1)
- IF rightt()
- IF StrCmp(type1,type2)
- dAdd(dDiv(dMul(value1,fact1,s),fact2,s),value2,value2)
- mget(accu,MUIA_Slider_Level,{cur})
- float2str(str,value2,cur)
- undef2:=FALSE
- ELSE
- StrCopy(str,'***')
- undef2:=TRUE
- ENDIF
- doMethodA(vd,[MUIM_NoNotifySet,MUIA_String_Contents,str])
- ELSE
- IF StrCmp(type1,type2)
- dAdd(dDiv(dMul(value2,fact2,s),fact1,s),value1,value1)
- mget(accu,MUIA_Slider_Level,{cur})
- float2str(str,value1,cur)
- undef1:=FALSE
- ELSE
- StrCopy(str,'***')
- undef1:=TRUE
- ENDIF
- doMethodA(vg,[MUIM_NoNotifySet,MUIA_String_Contents,str])
- ENDIF
- savelast()
- CASE ID_MNU_SUBSTR
- mget(vd,MUIA_String_Contents,{a})
- undef2:=supera2d(a,value2)
- mget(vg,MUIA_String_Contents,{a})
- undef1:=supera2d(a,value1)
- IF rightt()
- IF StrCmp(type1,type2)
- dSub(value2,dDiv(dMul(value1,fact1,s),fact2,s),value2)
- mget(accu,MUIA_Slider_Level,{cur})
- float2str(str,value2,cur)
- undef2:=FALSE
- ELSE
- StrCopy(str,'***')
- undef1:=TRUE
- ENDIF
- doMethodA(vd,[MUIM_NoNotifySet,MUIA_String_Contents,str])
- ELSE
- IF StrCmp(type1,type2)
- dSub(value1,dDiv(dMul(value2,fact2,s),fact1,s),value1)
- mget(accu,MUIA_Slider_Level,{cur})
- float2str(str,value1,cur)
- undef1:=FALSE
- ELSE
- StrCopy(str,'***')
- undef2:=TRUE
- ENDIF
- doMethodA(vg,[MUIM_NoNotifySet,MUIA_String_Contents,str])
- ENDIF
- savelast()
- CASE ID_SICONVERT
- IF rightt()
- ptr:=unit2
- ptr.siConvert(value2) /*ptr and value2 changed, they must be put to screen*/
- unit2.comp2str()
- set(ud,MUIA_String_Contents,str)
- float2str(str,value2)
- set(vd,MUIA_String_Contents,str)
- dCopy(fact2,t)
- ELSE
- ptr:=unit1
- ptr.siConvert(value1)
- unit1.comp2str()
- set(ug,MUIA_String_Contents,str)
- float2str(str,value1)
- set(vg,MUIA_String_Contents,str)
- dCopy(fact1,t)
- ENDIF
- savelast()
- CASE ID_UNDO
- /*UUUU*RRRRR*/ IF current=0
- /* | */ StringF(r,'\s:\s',cat.msgTools.getstr(),cat.msgUnDo.getstr())
- /* _V */ Mui_RequestA(app,window,0,r,NIL,cat.msgNoUndo.getstr(),NIL)
- /*UUU*RRRRRR*/ ELSE
- /* ¯ */ current--
- IF (un:=undo.getitem(current))=NIL
- StringF(r,'\s:\s',cat.msgTools.getstr(),cat.msgUnDo.getstr())
- Mui_RequestA(app,window,0,r,NIL,cat.msgNoUndo.getstr(),NIL)
- current++
- ELSE
- unit1.copycomp(un.u1)
- unit2.copycomp(un.u2)
- dCopy(value1,un.v1)
- dCopy(value2,un.v2)
-
- unit1.comp2str()
- nnset(ug,MUIA_String_Contents,str)
- float2str(str,value1)
- nnset(vg,MUIA_String_Contents,str)
- unit1.getinfo(fact1,zero1,type1)
-
- unit2.comp2str()
- nnset(ud,MUIA_String_Contents,str)
- float2str(str,value2)
- nnset(vd,MUIA_String_Contents,str)
- unit2.getinfo(fact2,zero2,type2)
- ENDIF
- ENDIF
- /*UUUU*RRRRR*/ CASE ID_REDO
- /* | */ IF current=(undosteps-1)
- /* V_ */ StringF(r,'\s:\s',cat.msgTools.getstr(),cat.msgReDo.getstr())
- /*UUUUU*RRRR*/ Mui_RequestA(app,window,0,r,NIL,cat.msgNoRedo.getstr(),NIL)
- /* ¯ */ ELSE
- current++
- un:=undo.getitem(current)
- unit1.copycomp(un.u1)
- unit2.copycomp(un.u2)
- dCopy(value1,un.v1)
- dCopy(value2,un.v2)
-
- unit1.comp2str()
- nnset(ug,MUIA_String_Contents,str)
- float2str(str,value1)
- nnset(vg,MUIA_String_Contents,str)
- unit1.getinfo(fact1,zero1,type1)
-
- unit2.comp2str()
- nnset(ud,MUIA_String_Contents,str)
- float2str(str,value2)
- nnset(vd,MUIA_String_Contents,str)
- unit2.getinfo(fact2,zero2,type2)
- ENDIF
- CASE ID_SETZERO
- mget(l_units,MUIA_List_Active,{n})
- IF n <> MUIV_List_Active_Off
- IF basegroup
- bptr:=bases[n]
- float2str(str,bptr.zero)
- askstr(cat.msgSetZero.getstr(),str,NUMERIC)
- ELSE
- mget(l_groups,MUIA_List_Active,{cur})
- gptr:=groups[cur]
- ptr:=gptr.list[n]
- IF ptr.simple()
- strarg,n:=findbase(ptr.base[])
- IF n=FALSE
- bptr:=bases[strarg]
- float2str(str,bptr.zero)
- askstr(cat.msgSetZero.getstr(),str,NUMERIC)
- ENDIF
- ELSE
- Mui_RequestA(app,window,0,cat.msgZeroVsCplxT.getstr(),NIL,cat.msgZeroVsCplx.getstr(),NIL)
- ENDIF
- ENDIF
- ENDIF
- CASE ID_ABOUTUD
- doMethodA(l_groups,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{a}])
- StringF(longstr,'\s\n' +
- '* \d \s\n' +
- '* \d \s\n' +
- '* \d \s.\n' +
- '\s, ''\s'', \s\n' +
- '\d \s.',cat.msgAboutUD.getstr(),nbases+1,cat.msgBaseUnits.getstr(),
- glen+2,cat.msgGroups.getstr(),nsi+1,cat.msgSItypes.getstr(),
- cat.msgTheCGA.getstr(),a,cat.msgTheCGB.getstr(),nunits+1,cat.msgComposedUnits.getstr())
- Mui_RequestA(app,window,0,cat.msgAboutUDT.getstr(),NIL,longstr,NIL)
-
- CASE ID_SHOWFORMULA
- StringF(longstr,'\s ',cat.msgReqToConvert.getstr())
- mget(ug,MUIA_String_Contents,{q})
- StrAdd(longstr,q);StrAdd(longstr,cat.msgReqInto.getstr())
- StrAdd(longstr,' ') ->How can we put spaces at the end of a catalog string?
- mget(ud,MUIA_String_Contents,{q})
- StrAdd(longstr,q);StrAdd(longstr,':')
- IF dCompare(dFloat(1,s),dDiv(fact1,fact2,t))
- IF dFix(t)=0
- dDiv(s,t,t)
- StrAdd(longstr,'\n')
- StrAdd(longstr,cat.msgReqDivide.getstr())
- StrAdd(longstr,' ')
- ELSE
- StrAdd(longstr,'\n')
- StrAdd(longstr,cat.msgReqMultiply.getstr())
- StrAdd(longstr,' ')
- ENDIF
- float2str(r,t,13)
- StrAdd(longstr,r)
- ENDIF
-
- IF dCompare(dFloat(0,s),dDiv(dSub(zero1,zero2,t),fact2,t))
- IF dFix(t)<0
- StrAdd(longstr,'\n')
- StrAdd(longstr,cat.msgReqSubstract.getstr())
- StrAdd(longstr,' ')
- dSub(s,t,t)
- ELSE
- StrAdd(longstr,'\n')
- StrAdd(longstr,cat.msgReqAdd.getstr())
- StrAdd(longstr,' ')
- ENDIF
- float2str(r,t,13)
- StrAdd(longstr,r)
- ENDIF
-
- Mui_RequestA(app,window,0,cat.msgShowFormula.getstr(),NIL,longstr,NIL)
- CASE ID_SADD
- askstr(cat.msgEnterSi.getstr(),'',BASE)
- CASE ID_GADD
- askstr(cat.msgNewGroup.getstr(),'',GROUP)
- CASE ID_GSORT
- gsort()
- doMethodA(l_groups,[MUIM_List_Remove,glen+1])
- doMethodA(l_groups,[MUIM_List_Sort])
- doMethodA(l_groups,[MUIM_List_InsertSingle,cat.msgBase.getstr(),glen+1])
- _returnid(ID_OPENG)
- CASE ID_ASORT
- IF basegroup
- bsort(SR_ALPHA)
- ELSE
- mget(l_groups,MUIA_List_Active,{cur})
- csort(SR_ALPHA,cur)
- ENDIF
- _returnid(ID_OPENG)
- CASE ID_NSORT
- IF basegroup
- bsort(SR_NUMERIC)
- ELSE
- mget(l_groups,MUIA_List_Active,{cur})
- csort(SR_NUMERIC,cur)
- ENDIF
- _returnid(ID_OPENG)
- CASE ID_RSORT ->Revert
- IF basegroup
- IF Even(nbases)
- z:=nbases/2-1
- ELSE
- z:=(nbases-3)/2
- ENDIF
- FOR i:=0 TO z
- cur:=bases[nbases-i]
- bases[nbases-i]:=bases[i]
- bases[i]:=cur
- ENDFOR
- ELSE
- mget(l_groups,MUIA_List_Active,{cur})
- gptr:=groups[cur]
- IF Odd(gptr.sze) -> Not the amount of object but the number of the last!
- z:=(gptr.sze-1)/2
- ELSE
- z:=(gptr.sze-2)/2
- ENDIF
- FOR i:=0 TO z
- cur:=gptr.list[gptr.sze-i]
- gptr.list[gptr.sze-i]:=gptr.list[i]
- gptr.list[i]:=cur
- ENDFOR
- ENDIF
- _returnid(ID_OPENG)
- CASE ID_CADD
- IF basegroup
- Mui_RequestA(app,window,0,cat.msgCompVsBgT.getstr(),NIL,cat.msgCompVsBg.getstr(),NIL)
- ELSE
- mget(l_groups,MUIA_List_Active,{cur})
- IF rightt()
- addcomp(cur,unit2,0)
- ELSE
- addcomp(cur,unit1,0)
- ENDIF
- ENDIF
- CASE ID_CDEL
- IF basegroup
- mget(l_units,MUIA_List_Active,{n})
- z:=Mui_RequestA(app,window,0,cat.msgDCompvBsT.getstr(),cat.msgDCompvBsB.getstr(),
- cat.msgDCompvBs.getstr(),
- NIL)
- bptr:=bases[n]
- StrCopy(r,bptr.name)
- n:=0
- IF z=1
- FOR cur:=0 TO glen
- gptr:=groups[cur]
- FOR i:=0 TO gptr.sze
- ptr:=gptr.list[i]
- line:=FALSE /*line is true if groups[cur].list[i]*/
- FOR o:=0 TO ptr.sze /*must be deleted*/
- IF StrCmp(ptr.base[o],r)
- line:=TRUE
- ENDIF
- ENDFOR
- IF line=TRUE
- n++
- ENDIF
- ENDFOR
- ENDFOR
- StringF(longstr,'\s \d \s \s \s \d \s',cat.msgCountResultA.getstr(),n,cat.msgCountResultB.getstr(),r,cat.msgCountResultC.getstr(),n,cat.msgCountResultD.getstr())
- z:=Mui_RequestA(app,window,0,cat.msgDCompvBsT.getstr(),cat.msgDCompvBsB2.getstr(),longstr,
- NIL)+1 /*Le "count" a disparu*/
- ENDIF
-
- IF (z=2) ->Efface les composées
- FOR cur:=0 TO glen
- n:=0 ->Décalage si une unité est supprimée
- gptr:=groups[cur]
- FOR i:=0 TO gptr.sze
- ptr:=gptr.list[i-n]
- line:=FALSE
- FOR o:=0 TO ptr.sze
- IF StrCmp(ptr.base[o],r)
- line:=TRUE
- ENDIF
- ENDFOR
- IF line=TRUE
- IF delcomp(cur,i-n) THEN cur--
- n++
- ENDIF
- ENDFOR
- ENDFOR
- ENDIF
- IF (z=2) OR (z=3) ->Efface la base
- mget(l_units,MUIA_List_Active,{n})
- IF n <> MUIV_List_Active_Off THEN delbase(n)
- ENDIF
-
- ELSE
- /*Delete the composed unit n°i of the group cur*/
- mget(l_units,MUIA_List_Active,{i})
- IF i <> MUIV_List_Active_Off
- mget(l_groups,MUIA_List_Active,{cur})
- doMethodA(l_units,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
- StringF(r,'*\s|\s',cat.msgYes.getstr(),cat.msgNo.getstr())
- StringF(longstr,'\s\n\ec\s ?',cat.msgChkDelUnit.getstr(),q)
- IF Mui_RequestA(app,window,0,cat.msgDCU.getstr(),r,longstr,NIL)=1
- IF Not(delcomp(cur,i)) THEN
- doMethodA(l_units,[MUIM_List_Remove,i])
- ENDIF
- ENDIF
- ENDIF
- CASE ID_BADD
- mget(l_groups,MUIA_List_Active,{cur})
-
- askstr(cat.msgBaseName.getstr(),'',BASE)
- strarg:=0
- IF rightt()
- strarg2:=FALSE
- ELSE
- strarg2:=TRUE
- ENDIF
- CASE ID_BDEL
- mget(l_units,MUIA_List_Active,{i})
- IF i <> MUIV_List_Active_Off
- IF basegroup
- StringF(r,'*\s|\s',cat.msgYes.getstr(),cat.msgNo.getstr())
- IF Mui_RequestA(app,window,0,cat.msgDBU.getstr(),r,cat.msgChkDelBase.getstr(),NIL)=1
- delbase(i)
- doMethodA(l_units,[MUIM_List_Remove,i])
- ENDIF
- ELSE
- mget(l_groups,MUIA_List_Active,{cur})
- gptr:=groups[cur]
- ptr:=gptr.list[i]
- StrCopy(longstr,cat.msgDeleteBaseVsC.getstr())
- IF ptr.sze <> 0
- StrAdd(longstr,cat.msgDeleteBaseVsC2.getstr())
- ELSE
- StrAdd(longstr,cat.msgDeleteBaseVsC3.getstr())
- ENDIF
-
- FOR i:=0 TO ptr.sze
- StrAdd(longstr,'\n<')
- StrAdd(longstr,ptr.base[i])
- StrAdd(longstr,'>')
- ENDFOR
- z:=Mui_RequestA(app,window,0,cat.msgDeleteBaseVsCT.getstr(),cat.msgDeleteBaseVsCB.getstr(),longstr,NIL)
- IF (z=2) ->Delete bases
- FOR i:=0 TO ptr.sze
- /*Supprime la base ptr.base[i]*/
- cur:=findbase(ptr.base[i])
- delbase(cur)
- ENDFOR
- ENDIF
- IF (z=1) OR (z=2) ->Delete composed
- mget(l_groups,MUIA_List_Active,{cur})
- mget(l_units,MUIA_List_Active,{i})
- IF Not(delcomp(cur,i)) THEN
- doMethodA(l_units,[MUIM_List_Remove,i])
- ENDIF
- ENDIF
- ENDIF
- CASE ID_BRENAME
- i:=TRUE
- mget(l_units,MUIA_List_Active,{strarg})
- IF strarg <> MUIV_List_Active_Off
- doMethodA(l_units,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
- IF basegroup
- StrCopy(str,cat.msgBase.getstr())
- StrAdd(str,':')
- StrAdd(str,cat.msgRename.getstr())
- StringF(r,'*\s|\s',cat.msgYes.getstr(),cat.msgNo.getstr())
- IF Mui_RequestA(app,window,0,str,r,cat.msgChkRenameBase.getstr(),NIL)=1
- set(strwin,MUIA_Window_Title,cat.msgRenameBase.getstr())
- ELSE
- i:=FALSE
- ENDIF
- ELSE
- NEW ptr
- IF ptr.decode(OP_REPL,q) = FALSE
- Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
- JUMP out
- ENDIF
- IF ptr.sze<>0
- Mui_RequestA(app,window,0,cat.msgBaseVsComposed.getstr(),NIL,cat.msgUseComposed.getstr(),NIL)
- i:=FALSE
- ELSE
- StringF(r,'*\s|\s',cat.msgYes.getstr(),cat.msgNo.getstr())
- IF Mui_RequestA(app,window,0,cat.msgBaseVsComposed.getstr(),r,cat.msgChkRenameBoth.getstr(),NIL) = 1
- set(strwin,MUIA_Window_Title,cat.msgRenameBoth.getstr())
- ELSE
- i:=FALSE
- ENDIF
- ENDIF
- ENDIF
- IF i
- set(strstr,MUIA_String_Contents,q)
- set(strwin,MUIA_Window_Open,MUI_TRUE)
- ENDIF
- ENDIF
- CASE ID_GRENAME
- doMethodA(l_groups,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
- askstr(cat.msgChkRenameGroup.getstr(),q,GROUP)
- mget(l_groups,MUIA_List_Active,{z})
- strarg:=z
- CASE ID_CRENAME
- mget(l_units,MUIA_List_Active,{strarg})
- IF strarg <> MUIV_List_Active_Off
- doMethodA(l_units,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
- askstr(cat.msgChkChangeComposed.getstr(),q,COMPOSED)
- ENDIF
- CASE ID_GDEL
- mget(l_groups,MUIA_List_Active,{cur})
- IF (cur = (glen+1)) OR (glen=0)
- bip()
- JUMP out
- ENDIF
- doMethodA(l_groups,[MUIM_List_Remove,cur])
- FOR i:=cur TO glen-1
- groups[i]:=groups[i+1]
- ENDFOR
- glen--
- /* ici: STR DONE */ CASE ID_STRDONE
- set(strwin,MUIA_Window_Open,FALSE)
- mget(strwin,MUIA_Window_Title,{q})
- IF StrCmp(q,cat.msgNewGroup.getstr())
- mget(strstr,MUIA_String_Contents,{q})
- IF badgroup(q) THEN JUMP out
- glen++
- NEW ptr
- NEW gptr
- groups[glen]:=gptr
- gptr.list:=NewR(50*4)
- IF rightt()
- ptr.copycomp(unit2,NEWC)
- ELSE
- ptr.copycomp(unit1,NEWC)
- ENDIF
- gptr.list[]:=ptr
- gptr.title:=String(StrLen(q))
- StrCopy(gptr.title,q)
- gptr.sze:=0
- r:=String(StrLen(q))
- StrCopy(r,q)
-
- doMethodA(l_groups,[MUIM_List_InsertSingle,r,glen])
- r:=String(50)
- doMethodA(l_groups,[MUIM_Set,MUIA_List_Active,glen])
- ELSEIF StrCmp(q,cat.msgEnterSi.getstr())
- IF nsi>19
- Mui_RequestA(app,window,0,cat.msgCreateSiT.getstr(),NIL,cat.msgNoSI.getstr(),NIL)
- ELSE
- mget(strstr,MUIA_String_Contents,{q})
- IF badbase(q) THEN JUMP out
- StringF(longstr,'\s \s \s',cat.msgCreateSi1.getstr(),q,cat.msgCreateSi2.getstr())
- i:=Mui_RequestA(app,window,0,cat.msgCreateSiT.getstr(),cat.msgCreateSiB.getstr(),longstr,NIL)
- IF (i=1) OR (i=2) OR (i=3) -> Create Base
- nsi++
- NEW ptr
- ptr.createsimple(q)
- si[nsi]:=ptr
- addbase(dFloat(1,s),-nsi,q)
- ENDIF
- IF (i=2) -> Create Composed
- mget(l_groups,MUIA_List_Active,{cur})
- addcomp(cur,ptr,0)
- ENDIF
- IF (i=1) -> Create Group
- savelast()
- IF rightt()
- unit2.copycomp(ptr)
- ELSE
- unit1.copycomp(ptr)
- ENDIF
- askstr(cat.msgNewGroup.getstr(),'',GROUP)
- ENDIF
- ENDIF
- savelast()
- ELSEIF StrCmp(q,cat.msgBaseName.getstr())
- mget(strstr,MUIA_String_Contents,{q})
- IF badbase(q) THEN JUMP out
- IF basegroup
- /*Créer Base*/
- IF strarg2 ->Gauche?
- addbase(value1,unit1,q,strarg)
- ELSE
- addbase(value2,unit2,q,strarg)
- ENDIF
- ELSE
- /*Créer Composée aussi*/
- mget(l_groups,MUIA_List_Active,{cur})
- i:=strarg /*cur:Groupe*/
- NEW ptr /*i:NComp. */
- ptr.createsimple(q) /*q:Nom */
- IF strarg2 ->Gauche?
- IF addbase(value1,unit1,q) THEN addcomp(cur,ptr,i)
- ELSE ->Droite?
- IF addbase(value2,unit2,q) THEN addcomp(cur,ptr,i)
- ENDIF
- ENDIF
- ELSEIF StrCmp(q,cat.msgSetZero.getstr())
- mget(strstr,MUIA_String_Contents,{q})
- bptr:=bases[strarg]
- supera2d(q,bptr.zero)
- ELSEIF StrCmp(q,cat.msgChkRenameGroup.getstr())
- mget(strstr,MUIA_String_Contents,{q})
- IF badgroup(q) THEN JUMP out
- gptr:=groups[strarg]
- StrCopy(gptr.title,q)
- replace(l_groups,strarg,q)
- ->StrCopy(lvt_groups[strarg],q)
- ->doMethod(l_groups,[MUIM_List_Redraw,strarg])
- ELSEIF StrCmp(q,cat.msgRenameBase.getstr())
- mget(strstr,MUIA_String_Contents,{q})
- IF badbase(q) THEN JUMP out
- replace(l_units,strarg,q)
- bptr:=bases[strarg]
- DisposeLink(bptr.name)
- bptr.name:=String(StrLen(q))
- StrCopy(bptr.name,q)
- ELSEIF StrCmp(q,cat.msgChkChangeComposed.getstr())
- IF basegroup
- z:=Mui_RequestA(app,window,NIL,cat.msgRCompVBsT.getstr(),cat.msgRCompVBsB.getstr(),cat.msgRCompVBs.getstr(),NIL)
-
- mget(strstr,MUIA_String_Contents,{q})
- StrCopy(str,q)
- doMethodA(l_units,[MUIM_List_GetEntry,strarg,{q}])
- StrCopy(r,q)
-
- IF (z=1)
- FOR cur:=0 TO glen
- gptr:=groups[cur]
- FOR i:=0 TO gptr.sze
- ptr:=gptr.list[i]
- line:=FALSE
- FOR o:=0 TO ptr.sze
- IF StrCmp(ptr.base[o],r)
- DisposeLink(ptr.base[o])
- ptr.base[o]:=String(StrLen(str))
- StrCopy(ptr.base[o],str)
- ENDIF
- ENDFOR
- ENDFOR
- ENDFOR
- ENDIF
-
- IF (z=1) OR (z=2)
- replace(l_units,strarg,str)
- bptr:=bases[strarg]
- DisposeLink(bptr.name)
- bptr.name:=String(StrLen(str))
- StrCopy(bptr.name,str)
- ENDIF
- ELSE
-
- mget(strstr,MUIA_String_Contents,{q}) ->q contient la nouvelle unité (PTR TO CHAR)
- i:=strarg ->i contient le n° d unité composée
- mget(l_groups,MUIA_List_Active,{cur}) ->.. dans le groupe cur
- gptr:=groups[cur]
- ptr:=gptr.list[i] ->ptr contient l unité composée à modifier
- END ptr ->groups[cur].list[i] est vidé
- NEW ptr ->ptr contient une unité composée prête
- ptr.sze:=0
- gptr.list[i]:=ptr ->groups[cur].list[i] est prêt
- IF ptr.decode(OP_REPL,q)=FALSE
- JUMP out
- ENDIF ->groups[cur].list[i] contient l unité décodée
- ptr.comp2str() ->str contient l unité recompilée
- replace(l_units,i,str)
- ENDIF
- ELSEIF StrCmp(q,cat.msgRenameBoth.getstr())
- mget(strstr,MUIA_String_Contents,{q}) /*q contient le nouveau nom.*/
- IF badbase(q) THEN JUMP out
- doMethodA(l_units,[MUIM_List_GetEntry,strarg,{a}])/*a contient l ancien nom.*/
- cur,n:=findbase(a)
- /*cur=numero de l unite de BASE*/
- IF n /*strarg=numero de l unite COMPOSEE*/
- /*dans la listview*/
- replace(l_units,strarg,q)
-
- bptr:=bases[cur]
- /*dans les bases*/ DisposeLink(bptr.name)
- bptr.name:=String(StrLen(q))
- StrCopy(bptr.name,q)
-
- mget(l_groups,MUIA_List_Active,{n})
- gptr:=groups[n]
- ptr:=gptr.list[strarg]
-
- DisposeLink(ptr.base[])
- ptr.base[]:=String(StrLen(q))
- StrCopy(ptr.base[],q)
-
- gptr.list[strarg]:=ptr
-
- ENDIF
- ELSEIF StrCmp(q,cat.msgFirstGroup.getstr())
- mget(strstr,MUIA_String_Contents,{q})
- StrCopy(r,q) /*r contient le nom du groupe*/
- askstr(cat.msgFirstUnit.getstr(),'m',BASE)
- ELSEIF StrCmp(q,cat.msgFirstUnit.getstr())
- mget(strstr,MUIA_String_Contents,{q})
- StrCopy(str,q) /*str contient le nom de l unité*/
- set(strwin,MUIA_Window_CloseGadget,MUI_TRUE)
- set(window,MUIA_Window_Title,cat.msgClearing.getstr())
- doMethodA(l_groups,[MUIM_List_Clear])
- doMethodA(l_units,[MUIM_List_Clear])
- FOR i:=0 TO nbases
- bptr:=bases[i]
- END bptr
- ENDFOR
- /*FOR i:=0 TO glen
- gptr:=groups[i]
- FOR o:=0 TO gptr.sze ->Doesn't this make sense????
- ptr:=gptr.list
- END ptr[50]
- ENDIF
- ENDFOR*/
- set(window,MUIA_Window_Title,cat.msgCreating.getstr())
- newud(r,str)
- set(window,MUIA_Window_Title,cat.msgTleft.getstr())
- set(window,MUIA_Window_Sleep,FALSE)
- ENDIF
- CASE ID_NEWUD
- z:=Mui_RequestA(app,window,0,cat.msgNewUnitData.getstr(),cat.msgNudB.getstr(),cat.msgNud.getstr(),NIL)
- IF z=2
- saveud()
- z:=1
- ENDIF
- IF z=1
- set(window,MUIA_Window_Sleep,MUI_TRUE)
- set(strwin,MUIA_Window_CloseGadget,FALSE)
- askstr(cat.msgFirstGroup.getstr(),cat.msgDefGroup.getstr(),GROUP)
- ENDIF
- CASE ID_LOADUD
- doMethodA(l_groups,[MUIM_List_Clear])
- loadud()
- set(l_groups,MUIA_List_Active,MUIV_List_Active_Top)
- _returnid(ID_OPENG)
- CASE ID_SAVEAS
- filereq:=Mui_AllocAslRequest(ASL_FILEREQUEST,
- [ASL_HAIL, cat.msgSaveAsT.getstr(),
- ASL_OKTEXT, cat.msgSave.getstr(),
- ASL_FILE, 'UnitData',
- ASL_FUNCFLAGS, FILF_SAVE,
- NIL])
- IF filereq=NIL
- Mui_RequestA(app,window,0,cat.msgSaveAsT.getstr(),NIL,cat.msgNoAslRequest.getstr(),NIL)
- ELSE
- IF Mui_AslRequest(filereq,NIL)
- StrCopy(str,filereq.drawer)
- AddPart(str,filereq.file,StrMax(str))
- SetStr(str,StrLen(str))
- saveud(str)
- ENDIF
- Mui_FreeAslRequest(filereq)
- ENDIF
- CASE ID_LOADFROM
- filereq:=Mui_AllocAslRequest(ASL_FILEREQUEST,
- [ASL_HAIL, cat.msgLoadFromT.getstr(),
- ASL_OKTEXT, cat.msgLoad.getstr(),
- ASL_FILE, 'UnitData',
- NIL])
- IF filereq=NIL
- Mui_RequestA(app,window,0,cat.msgLoadFromT.getstr(),NIL,cat.msgNoAslRequest.getstr(),NIL)
- ELSE
- IF Mui_AslRequest(filereq,NIL)
- StrCopy(str,filereq.drawer)
- AddPart(str,filereq.file,StrMax(str))
- SetStr(str,StrLen(str))
-
- doMethodA(l_groups,[MUIM_List_Clear])
- loadud(str)
- set(l_groups,MUIA_List_Active,MUIV_List_Active_Top)
- _returnid(ID_OPENG)
- ENDIF
- Mui_FreeAslRequest(filereq)
- ENDIF
- CASE ID_UDSAVE
- saveud()
- CASE ID_SETLEFT
- IF rightt()
- set(window,MUIA_Window_Title,cat.msgTleft.getstr())
- ENDIF
- CASE ID_SETRIGHT
- IF Not(rightt())
- set(window,MUIA_Window_Title,cat.msgTright.getstr())
- ENDIF
- CASE ID_SWITCH
- IF rightt()
- set(window,MUIA_Window_Title,cat.msgTleft.getstr())
- ELSE
- set(window,MUIA_Window_Title,cat.msgTright.getstr())
- ENDIF
- CASE ID_INVERSE
- IF rightt()
- unit2.inverse(type2)
- dDiv(dFloat(1,t),fact2,fact2)
- convert(DR_LEFT)
- StrCopy(r,unit2.comp2str())
- set(ud,MUIA_String_Contents,r)
- IF dCompare(dFloat(0,t),value2) = 0
- undef2:=TRUE
- StringF(r,'***')
- ELSE
- dDiv(t,value2,value2)
- float2str(r,value2)
- ENDIF
- set(vd,MUIA_String_Contents,r)
- ELSE
- unit1.inverse(type1)
- dDiv(dFloat(1,t),fact1,fact1)
- convert(DR_RIGHT)
- StrCopy(r,unit1.comp2str())
- set(ug,MUIA_String_Contents,r)
- IF dCompare(dFloat(0,t),value1) = 0
- undef1:=TRUE
- StringF(r,'***')
- ELSE
- dDiv(t,value1,value1)
- float2str(r,value1)
- ENDIF
- set(vg,MUIA_String_Contents,r)
- ENDIF
- savelast()
- CASE ID_CALC
- convert()
- CASE ID_UNICALC
- convert(DR_UNIVERSAL)
- CASE ID_ABOUT
- StringF(longstr,'\s\n\s',PROGVER,cat.msgAboutReq.getstr())
- Mui_RequestA(app, window, 0, NIL, cat.msgOk.getstr(), longstr,NIL)
- CASE ID_HCONT
- doMethodA(app, [MUIM_Application_ShowHelp,NIL,'convertor.guide','main'])
- CASE ID_HSBC
- doMethodA(app, [MUIM_Application_ShowHelp,NIL,'convertor.guide','sbc'])
- CASE ID_BUBBLES
- IF bubbles
- bubbles:=FALSE
- set(g1,MUIA_ShortHelp,NIL)
- set(g2,MUIA_ShortHelp,NIL)
- set(g3,MUIA_ShortHelp,NIL)
- set(accu,MUIA_ShortHelp,NIL)
- set(ld,MUIA_ShortHelp,NIL)
- set(lv_groups,MUIA_ShortHelp,NIL)
- set(lv_pfx,MUIA_ShortHelp,NIL)
- set(lv_units,MUIA_ShortHelp,NIL)
- ELSE
- bubbles:=TRUE
- set(g1,MUIA_ShortHelp,cat.msgActionHelp.getstr())
- set(g2,MUIA_ShortHelp,cat.msgValueHelp.getstr())
- set(g3,MUIA_ShortHelp,cat.msgUnitHelp.getstr())
- set(accu,MUIA_ShortHelp,cat.msgAccHelp.getstr())
- set(ld,MUIA_ShortHelp,cat.msgLdHelp.getstr())
- set(lv_groups,MUIA_ShortHelp,cat.msgGroupsLHelp.getstr())
- set(lv_pfx,MUIA_ShortHelp,cat.msgPrefixesLHelp.getstr())
- set(lv_units,MUIA_ShortHelp,cat.msgUnitsLHelp.getstr())
- ENDIF
- CASE ID_RESET
- doMethodA(l_groups,[MUIM_List_Clear])
- loadud()
- set(l_groups,MUIA_List_Active,MUIV_List_Active_Top)
- set(ug,MUIA_String_Contents,'m')
- set(ud,MUIA_String_Contents,'m')
- set(vg,MUIA_String_Contents,'1')
- set(vd,MUIA_String_Contents,'1')
- dFloat(1,fact1)
- dFloat(1,fact2)
- unit1.createsimple('m')
- unit2.createsimple('m')
- set(bt_c,MUIA_Selected,MUI_TRUE)
- set(accu,MUIA_Slider_Level,14)
- set(l_groups,MUIA_List_Active,0)
- set(l_pfx,MUIA_List_Active,10)
- set(l_units,MUIA_List_Active,0)
- _returnid(ID_OPENG)
- CASE ID_HIDE
- set(app,MUIA_Application_Iconified,MUI_TRUE)
- CASE ID_PREFS
- doMethodA(app, [MUIM_Application_OpenConfigWindow,NIL])
- CASE ID_MABOUT
- doMethodA(app, [MUIM_Application_AboutMUI,window])
- CASE ID_OPENG
- set(l_units,MUIA_List_Quiet,MUI_TRUE)
- doMethodA(l_units,[MUIM_List_Clear])
- mget(l_groups,MUIA_List_Active,{cur})
- IF cur <> MUIV_List_Active_Off
- nunits:=-1
- doMethodA(l_groups,[MUIM_List_GetEntry,cur,{q}])
- IF StrCmp(q,cat.msgBase.getstr())
- basegroup:=TRUE
- FOR i:=0 TO nbases
- nunits++
- bptr:=bases[i]
- a:=String(StrLen(bptr.name))
- StrCopy(a,bptr.name)
-
- doMethodA(l_units,[MUIM_List_InsertSingle,a,MUIV_List_Insert_Bottom])
- ENDFOR
- ELSE
- basegroup:=FALSE
- gptr:=groups[cur]
- FOR i:=0 TO gptr.sze
- nunits++
- ptr:=gptr.list[i]
- a:=String(StrLen(ptr.comp2str()))
- StrCopy(a,str)
- doMethodA(l_units,[MUIM_List_InsertSingle,a,MUIV_List_Insert_Bottom])
- ENDFOR
- ENDIF
- ENDIF
- set(l_units,MUIA_List_Quiet,FALSE)
- CASE ID_READU
- IF rightt()
- readu(TRUE)
- convert(DR_LEFT)
- ELSE
- readu(FALSE)
- convert(DR_RIGHT)
- ENDIF
- CASE ID_CALCR
- convert(DR_RIGHT)
- CASE ID_CALCL
- convert(DR_LEFT)
- CASE ID_WRITE
- StrCopy(r,unit1.comp2str())
- nnset(ug,MUIA_String_Contents,r)
- StrCopy(r,unit2.comp2str())
- nnset(ud,MUIA_String_Contents,r)
-
- IF undef1
- StrCopy(r,'***')
- ELSE
- float2str(r,value1)
- ENDIF
- nnset(vg,MUIA_String_Contents,r)
- IF undef2
- StrCopy(r,'***')
- ELSE
- float2str(r,value2)
- ENDIF
- nnset(vd,MUIA_String_Contents,r)
- CASE ID_LEFTU
- mget(ug,MUIA_String_Contents,{q})
- IF unit1.decode(OP_REPL,q,fact1,PFX_ORIGINAL,zero1,type1) = FALSE
- JUMP out
- ENDIF
- unit1.comp2str()
- set(ug,MUIA_String_Contents,str)
- chkzero()
- convert()
- savelast()
- CASE ID_RIGHTU
- mget(ud,MUIA_String_Contents,{q})
- IF unit2.decode(OP_REPL,q,fact2,PFX_ORIGINAL,zero2,type2) = FALSE
- JUMP out
- ENDIF
- unit2.comp2str()
- set(ud,MUIA_String_Contents,str)
- convert()
- chkzero()
- savelast()
- ENDSELECT
- out:
- IF sigs THEN Wait(sigs)
- ENDWHILE
- ELSE
- Mui_RequestA(app,window,0,'Convertor',0,cat.msgNoApp.getstr(),0)
- ENDIF
- ELSE
- WriteF('\s\n\s',cat.msgFailure.getstr(),cat.msgNoMui.getstr())
- ENDIF
- EXCEPT DO
- IF exception
- SELECT exception
- CASE ER_NOUD
- Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgERnoud.getstr(),0)
- CASE ER_EMUD
- Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgERemud.getstr(),0)
- CASE ER_BADUD
- Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgERbadud.getstr(),0)
- CASE ER_BADFORMAT
- Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgERbadformat.getstr(),0)
- CASE ER_NOCLASSES
- Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgNoClasses.getstr(),0)
- CASE "MEM"
- Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,cat.msgLowMemory.getstr(),0)
- CASE ER_LOC
- Mui_RequestA(app,window,0,'FAILURE!',0,'Couldn''t open Locale.library!\n',0) /*Attention, il ne faut pas "localiser" ceci! :-)*/
- DEFAULT
- Mui_RequestA(app,window,0,cat.msgFailure.getstr(),0,'%s %n',[cat.msgUnknownError.getstr(),exception])
- ENDSELECT
- ENDIF
- dCleanup()
- IF app THEN Mui_DisposeObject(app)
- IF undo THEN END undo
- cat.close()
- exitclasses()
- IF muimasterbase THEN CloseLibrary(muimasterbase)
- IF localebase THEN CloseLibrary(localebase)
- ENDPROC
-
- PROC appstruct() IS ApplicationObject,
- MUIA_Application_Title, 'Convertor',
- MUIA_Application_Version, PROGVER,
- MUIA_Application_Author, 'Maxime Gamboni',
- MUIA_Application_Description, cat.msgExchange.getstr(),
- MUIA_Application_Base, 'CONVERTOR',
- MUIA_Application_Menustrip, Mui_MakeObjectA(MUIO_MenustripNM,[menu,0]),
- SubWindow, strwin:=WindowObject,
- MUIA_Window_ID,"STRW",
- MUIA_Window_Width, MUIV_Window_Width_Screen(50),
- MUIA_Window_Height, MUIV_Window_Height_Screen(50),
- MUIA_Window_ScreenTitle,PROGNAME,
-
- WindowContents,strstr:=StringObject,
- StringFrame,
- End,
- End,
-
- SubWindow, window:=WindowObject,
- MUIA_Window_Title, cat.msgTleft.getstr(),
- MUIA_Window_ID, "CONV",
- MUIA_Window_Width, MUIV_Window_Width_Screen(50),
- MUIA_Window_Height, MUIV_Window_Height_Screen(50),
- MUIA_Window_ScreenTitle,PROGNAME,
-
- WindowContents, VGroup,
- Child, g2:=HGroup,
- Child, vg:=NewObjectA(cl_sstring.mcc_class,NIL,[
- StringFrame,
- MUIA_String_Format,MUIV_String_Format_Center,
- MUIA_String_Contents,'1',
- MUIA_Draggable,MUI_TRUE,
- MUIA_Dropable,MUI_TRUE,
- End,
- Child, vd:=NewObjectA(cl_sstring.mcc_class,NIL,[
- StringFrame,
- MUIA_String_Format,MUIV_String_Format_Center,
- MUIA_String_Contents,'1',
- MUIA_Draggable,MUI_TRUE,
- MUIA_Dropable,MUI_TRUE,
- TAG_DONE]),
- End,
- Child, g3:=HGroup,
- Child, ug:=NewObjectA(cl_sstring.mcc_class,NIL,[
- StringFrame,
- MUIA_String_Format,MUIV_String_Format_Center,
- MUIA_String_Contents,'m',
- MUIA_Draggable,MUI_TRUE,
- MUIA_Dropable,MUI_TRUE,
- End,
- Child, ud:=NewObjectA(cl_sstring.mcc_class,NIL,[
- StringFrame,
- MUIA_String_Format,MUIV_String_Format_Center,
- MUIA_String_Contents,'m',
- MUIA_Draggable,MUI_TRUE,
- MUIA_Dropable,MUI_TRUE,
- End,
- End,
- Child, HGroup,
- Child, g1:=HGroup,GroupFrameT(cat.msgAction.getstr()),
- Child, bt_a:= TextObject,
- MUIA_Frame,MUIV_Frame_Button,
- MUIA_Background,MUII_ButtonBack,
- MUIA_Text_Contents,'c×',
- MUIA_InputMode,MUIV_InputMode_Toggle,
- MUIA_Selected,FALSE,
- End,
- Child, bt_b:= TextObject,
- MUIA_Frame,MUIV_Frame_Button,
- MUIA_Background,MUII_ButtonBack,
- MUIA_Text_Contents,'c÷',
- MUIA_InputMode,MUIV_InputMode_Toggle,
- MUIA_Selected,FALSE,
- End,
- Child, bt_c:= TextObject,
- MUIA_Frame,MUIV_Frame_Button,
- MUIA_Background,MUII_ButtonBack,
- MUIA_Text_Contents,'c=',
- MUIA_InputMode,MUIV_InputMode_Toggle,
- MUIA_Selected,MUI_TRUE,
- End,
- End,
- Child, accu:=SliderObject,MUIA_Slider_Max,14,MUIA_Slider_Min,1,
- MUIA_FrameTitle, cat.msgAccuracy.getstr(),
- MUIA_Slider_Level,14,
- End,
- End,
- Child, HGroup,
- Child, RectangleObject,End,
- Child, ld:=RadioObject, MUIA_Disabled,TRUE,MUIA_Radio_Entries,ldtxt,
- GroupFrame,End,
- Child, RectangleObject,End,
- End,
- Child, HGroup,
- Child, lv_groups := ListviewObject,
- MUIA_FrameTitle,cat.msgGroups.getstr(),
- MUIA_Listview_DragType,1,
- MUIA_Listview_Input, MUI_TRUE,
- MUIA_Listview_List, l_groups:=NewObjectA(cl_droplist.mcc_class,NIL,
- [ InputListFrame,
- MUIA_List_DragSortable,MUI_TRUE,
- End,
- End,
- Child, BalanceObject ,End,
- Child, lv_pfx := ListviewObject,
- MUIA_FrameTitle,cat.msgPrefixes.getstr(),
- MUIA_Listview_Input, MUI_TRUE,
- MUIA_Listview_List, l_pfx:=ListObject,
- InputListFrame,
- MUIA_List_SourceArray,lvt_pfx,
- End,
- End,
- Child, BalanceObject, End,
- Child, lv_units := ListviewObject,
- MUIA_FrameTitle,cat.msgUnits.getstr(),
- MUIA_Listview_Input, MUI_TRUE,
- MUIA_Listview_DragType,1,
- MUIA_Listview_List,l_units:=NewObjectA(cl_droplist.mcc_class,NIL,
- [InputListFrame,
- MUIA_List_DragSortable,MUI_TRUE,
- End,
- End,
- End,
-
- End,
- End,
- End
-
- PROC bip()
- DEF scr
- mget(window,MUIA_Window_Screen,{scr});DisplayBeep(scr)
- ENDPROC TRUE
- PROC badgroup(name)
- DEF j
- IF StrCmp(name,cat.msgBase.getstr()) THEN RETURN bip()
- FOR j:=0 TO glen
- gptr:=groups[j]
- IF StrCmp(gptr.title,name) THEN RETURN bip()
- ENDFOR
- IF InStr(name,'"')<>-1 THEN RETURN bip()
- IF InStr(name,' ')<>-1 THEN RETURN bip()
- ENDPROC (StrLen(name)=0)
-
- PROC badbase(name)
- DEF j,n[2]:STRING
- FOR j:=0 TO 9 /*0,1,...,9*/
- StringF(n,'\d',j)
- IF InStr(name,n)<>-1 THEN RETURN bip()
- ENDFOR
- FOR j:=0 TO nbases
- bptr:=bases[j]
- IF StrCmp(bptr.name,name) THEN RETURN bip()
- ENDFOR
- IF InStr(name,'*')<>-1 THEN RETURN bip()
- IF InStr(name,'/')<>-1 THEN RETURN bip()
- IF InStr(name,'^')<>-1 THEN RETURN bip()
- IF InStr(name,'+')<>-1 THEN RETURN bip()
- IF InStr(name,'-')<>-1 THEN RETURN bip()
- IF InStr(name,'(')<>-1 THEN RETURN bip()
- IF InStr(name,')')<>-1 THEN RETURN bip()
- IF InStr(name,'.')<>-1 THEN RETURN bip()
- IF InStr(name,'"')<>-1 THEN RETURN bip()
- IF InStr(name,' ')<>-1 THEN RETURN bip()
- ENDPROC (StrLen(name)=0)
-
- PROC initC() /*Initialize Convertor*/
- unit1.base:=NewR(8)
- unit1.pfx:=NewR(8)
- unit1.expo:=NewR(8)
- unit1.sze:=0
- unit1.base[]:=String(2);StrCopy(unit1.base[],'m')
- unit1.pfx[]:=20;dFloat(0,value1);dFloat(1,fact1);dFloat(0,zero1)
- StrCopy(type1,'ONNNNNNNNNNNNNNNNNNN')
- unit1.expo[]:=1
- unit2.base:=NewR(8)
- unit2.pfx:=NewR(8)
- unit2.expo:=NewR(8)
- unit2.sze:=0
- unit2.base[]:=String(2);StrCopy(unit2.base[],'m')
- unit2.pfx[]:=20;dFloat(0,value2);dFloat(1,fact2);dFloat(0,zero2)
- StrCopy(type2,'ONNNNNNNNNNNNNNNNNNN')
- unit2.expo[]:=1
- pref[0].name:= 'Y';dFloat(24,pref[0].exp)
- pref[1].name:= 'Z';dFloat(21,pref[1].exp)
- pref[2].name:= 'E';dFloat(18,pref[2].exp)
- pref[3].name:= 'P';dFloat(15,pref[3].exp)
- pref[4].name:= 'T';dFloat(12,pref[4].exp)
- pref[5].name:= 'G';dFloat( 9,pref[5].exp)
- pref[6].name:= 'M';dFloat( 6,pref[6].exp)
- pref[7].name:= 'K';dFloat( 3,pref[7].exp)
- pref[8].name:= 'H';dFloat( 2,pref[8].exp)
- pref[9].name:='Da';dFloat( 1,pref[9].exp)
- pref[10].name:='d';dFloat(-1,pref[10].exp)
- pref[11].name:='c';dFloat(-2,pref[11].exp)
- pref[12].name:='m';dFloat(-3,pref[12].exp)
- pref[13].name:='µ';dFloat(-6,pref[13].exp)
- pref[14].name:='n';dFloat(-9,pref[14].exp)
- pref[15].name:='p';dFloat(-12,pref[15].exp)
- pref[16].name:='f';dFloat(-15,pref[16].exp)
- pref[17].name:='a';dFloat(-18,pref[17].exp)
- pref[18].name:='z';dFloat(-21,pref[18].exp)
- pref[19].name:='y';dFloat(-24,pref[19].exp)
- dFloat(0,pref[20].exp)
- pref[20].name:=NIL
- dFloat(10,ten)
- savelast()
- ENDPROC
-
- PROC supera2d(source:PTR TO CHAR,dest:PTR TO longreal) HANDLE
- DEF mtd=NIL:PTR TO mathtermd
- IF StrCmp(source,'***')
- dFloat(0,dest)
- RETURN TRUE
- ENDIF
- NEW mtd.mathtermd(source,NIL)
- mtd.calc(dest)
- EXCEPT DO
- IF mtd THEN END mtd
- IF exception = ER_MATH
- dFloat(0,dest)
- RETURN TRUE
- ENDIF
- IF exception THEN Raise(exception)
- ENDPROC FALSE
-
- PROC convert(direction=DR_CURR)
- DEF abort
- abort:=noconvert
- IF direction=DR_UNIVERSAL
- abort:=FALSE
- direction:=DR_CURR
- ENDIF
- IF direction=DR_CURR
- IF rightt()
- direction:=DR_LEFT
- ELSE
- direction:=DR_RIGHT
- ENDIF
- ENDIF
- IF direction=DR_RIGHT
- _returnid(ID_SETLEFT)
- mget(vg,MUIA_String_Contents,{a})
- undef1:=supera2d(a,value1)
- IF abort THEN RETURN
- IF StrCmp(type1,type2)
- IF level()
- dDiv(dMul(value1,fact1,s),fact2,value2)
- ELSE
- dDiv(dAdd(dMul(value1,fact1,s),dSub(zero1,zero2,t),s),fact2,value2)
- ENDIF
- dCopy(s,value2)
- dAbs(s)
- dLog(s)
- i:=Max(0,dFix(s))
- mget(accu,MUIA_Slider_Level,{cur})
- float2str(str,value2,cur)
- undef2:=FALSE
- ELSE
- StrCopy(str,'***')
- undef2:=TRUE
- ENDIF
- doMethodA(vd,[MUIM_NoNotifySet,MUIA_String_Contents,str])
- ELSEIF direction=DR_LEFT
- _returnid(ID_SETRIGHT)
- mget(vd,MUIA_String_Contents,{b})
- undef2:=supera2d(b,value2)
- IF abort THEN RETURN
- IF StrCmp(type1,type2)
- IF level()
- dDiv(dMul(value2,fact2,s),fact1,value1)
- ELSE
- dDiv(dAdd(dMul(value2,fact2,s),dSub(zero2,zero1,t),s),fact1,value1)
- ENDIF
- dCopy(s,value1)
- dLog(dAbs(s))
- i:=Max(0,dFix(s))
- mget(accu,MUIA_Slider_Level,{cur})
- float2str(str,value1,cur)
- undef1:=FALSE
- ELSE
- StrCopy(str,'***')
- undef1:=TRUE
- ENDIF
- doMethodA(vg,[MUIM_NoNotifySet,MUIA_String_Contents,str])
- ENDIF
- ENDPROC
-
- PROC rightt()
- DEF title:PTR TO CHAR
- mget(window,MUIA_Window_Title,{title})
- ENDPROC StrCmp(title,cat.msgTright.getstr())
-
- PROC savelast()
- DEF j
- IF current<(undosteps-1) /*suppression des noeuds redo inutiles*/
- FOR j:=current+1 TO undosteps-1
- un:=undo.getitem(j)
- IF un <> NIL THEN
- END un.v1;END un.v2;END un.u1;END un.u2;END un
- undo.setitem(j,NIL)
- ENDFOR
- ENDIF
- NEW un /*Création d'un noeud Undo avec les valeurs en cours*/
- NEW un.v1
- NEW un.v2
- NEW un.u1
- NEW un.u2
- dCopy(un.v1,value1)
- dCopy(un.v2,value2)
- un.u1.copycomp(unit1,NEWC)
- un.u2.copycomp(unit2,NEWC)
- undo.setitem(current+1,un) /*ajout du nouveau noeud dans la liste*/
- undo.first:=Mod(current+2+undo.first,undosteps)
- current:=undosteps-1 /*pas de redo...*/
- ENDPROC
-
- PROC chkzero()
- IF (unit1.simple() AND unit2.simple())<>TRUE
- set(ld,MUIA_Disabled,MUI_TRUE)
- RETURN
- ENDIF
- IF dCompare(zero1,zero2)
- set(ld,MUIA_Disabled,FALSE)
- ELSE
- set(ld,MUIA_Disabled,MUI_TRUE)
- ENDIF
- ENDPROC
-
- PROC level()
- mget(ld,MUIA_Disabled,{z})
- IF z=TRUE
- RETURN TRUE
- ENDIF
- mget(ld,MUIA_Radio_Active,{z})
- ENDPROC z=1
-
- PROC splitfloat(source:PTR TO myreal)
- ENDPROC source.a,source.b
-
- PROC joinfloat(source1,source2,dest:PTR TO myreal)
- dest.a:=source1
- dest.b:=source2
- ENDPROC
-
- PROC float2str(st:PTR TO CHAR,lr:PTR TO longreal,digits=14)
- DEF longr:longreal,ps,j,buff[30]:STRING,
- wk[30]:STRING,big,expn[6]:STRING
-
- digits++
- dCopy(longr,lr)
- dLog(dAbs(longr))
- j:=dFix(longr)
- IF Abs(j)>8
- IF j < 0
- dLFormat(st,lr,Min(13,digits))
- ELSE
- dLFormat(st,lr,digits)
- ENDIF
- big:=InStr(st,'E')
- IF big =-1
- big:=FALSE
- StrCopy(wk,st)
- ELSE
- StrCopy(wk,st,big)
- MidStr(expn,st,big)
- big:=TRUE
- ENDIF
- ELSE
- big:=FALSE
- j:=Max(0,j)
- dFormat(st,lr,Max(1,digits-j-1))
- StrCopy(wk,st)
- ENDIF
-
- ps:=StrLen(wk)-1
- MidStr(buff,wk,ps)
- IF Val(buff)>4 -> Supprime les neufs et incr.
- REPEAT
- SetStr(wk,StrLen(wk)-1)
- ps:=StrLen(wk)-1
- MidStr(buff,wk,ps)
- UNTIL Not(StrCmp(buff,'9'))
- IF StrCmp(buff,'.')
- MidStr(buff,wk,0,ps)
- j:=Val(buff)
- StringF(wk,'\d',j+Sign(j))
- ELSE
- j:=Val(buff)
- StringF(buff,'\d',j+1)
- wk[ps]:=buff[]
- ENDIF
- ELSEIF StrCmp(buff,'0') -> Supprime les zéros.
- REPEAT
- SetStr(wk,StrLen(wk)-1)
- ps:=StrLen(wk)-1
- MidStr(buff,wk,ps)
- UNTIL Not(StrCmp(buff,'0'))
- IF StrCmp(buff,'.')
- SetStr(wk,StrLen(wk)-1)
- ENDIF
- ELSE
- SetStr(wk,StrLen(wk)-1)
- ps:=StrLen(wk)-1
- MidStr(buff,wk,ps)
- IF StrCmp(buff,'.') THEN SetStr(wk,StrLen(wk)-1)
- /*MidStr(buff,wk,digits,1)
- j:=Val(buff)
- StringF(buff,'\d',j+1)
- wk[digits]:=buff[]*/
- ENDIF
-
- StrCopy(st,wk)
- IF big
- StrAdd(st,expn)
- ENDIF
- ENDPROC st
-
- PROC saveud(filename=-1:PTR TO CHAR)
- DEF k,l,m[21]:STRING
-
- IF filename=-1 THEN filename:='UnitData'
-
- set(window,MUIA_Window_Title,cat.msgSaveUDA.getstr())
- handler:=Open(filename,NEWFILE)
- oldstdout:=SetStdOut(handler)
- WriteF('CONVERTOR-UnitData Type4\n:SI\n')
- FOR i:=0 TO nsi-1
- ptr:=si[i]
- ptr.comp2str()
- IF i <> 0 THEN WriteF(';')
- WriteF(str)
- ENDFOR
- WriteF('\n:Bases\n')
- FOR i:=0 TO nbases
- bptr:=bases[i]
- WriteF('\s\n',bptr.name)
- k,l:=splitfloat(bptr.value)
- WriteF('\z\h[8]\z\h[8]',k,l)
- IF dCompare(dFloat(0,s),bptr.zero)
- k,l:=splitfloat(bptr.zero)
- WriteF('\z\h[8]\z\h[8]',k,l)
- ENDIF
- StrCopy(m,bptr.type)
- k:=StrLen(m)-1 -> last char
- WHILE (k > 0) AND (m[k]="N")
- k--
- ENDWHILE
- SetStr(m,k+1)
- WriteF('\n\s\n',m)
- ENDFOR
- WriteF(':Groups\n')
-
- set(window,MUIA_Window_Title,cat.msgSaveUDB.getstr())
- FOR cur:=0 TO glen
- gptr:=groups[cur]
- WriteF(':Group \s\n',gptr.title)
- FOR i:=0 TO gptr.sze
- nunits++
- ptr:=gptr.list[i]
- ptr.comp2str()
- WriteF('\s\n',str)
- ENDFOR
- ENDFOR
-
- SetStdOut(oldstdout)
- Close(handler)
- set(window,MUIA_Window_Title,cat.msgTleft.getstr())
- ENDPROC
-
- PROC loadud(filename=-1)
- DEF quit,stri[40]:STRING,silist[40]:STRING,ptc:PTR TO CHAR,nme[50]:STRING,
- j,k,var
-
- IF filename=-1 ; StrCopy(nme,'UnitData')
- ELSE; StrCopy(nme,filename) ; ENDIF
-
- cur:=-1
- glen:=-1
- quit:=FALSE
- line:=-1
- nbases:=-1
-
- IF handler:=Open(nme,OLDFILE)
- statusu:=ReadStr(handler,r)
- IF r[] OR (statusu <> -1)
- IF Not(StrCmp(r,'CONVERTOR-UnitData Type4'))
- Close(handler)
- Raise(ER_BADUD)
- ENDIF
- ELSE
- Close(handler)
- Raise(ER_EMUD)
- ENDIF
-
- statusu:=ReadStr(handler,r)
- IF r[] OR (statusu <> -1)
- IF Not(StrCmp(r,':SI'))
- Mui_RequestA(app,window,0,'Convertor',0,cat.msgNoSiTag.getstr(),0)
- Close(handler)
- Raise(ER_BADFORMAT)
- ENDIF
- ELSE
- Close(handler)
- Raise(ER_BADFORMAT)
- ENDIF
-
- statusu:=ReadStr(handler,r)
- IF r[] OR (statusu <> -1)
- StrCopy(silist,r)
- ELSE
- Close(handler)
- Raise(ER_BADFORMAT)
- ENDIF
-
- statusu:=ReadStr(handler,r)
- IF r[] OR (statusu <> -1)
- IF Not(StrCmp(r,':Bases'))
- Mui_RequestA(app,window,0,'Convertor',0,cat.msgNoBasesTag.getstr(),0)
- Close(handler)
- Raise(ER_BADFORMAT)
- ENDIF
- ELSE
- Close(handler)
- Raise(ER_EMUD)
- ENDIF
- REPEAT
- statusu:=ReadStr(handler,r) /*(1)*/
- IF Not(r[]) AND (statusu = -1)
- Mui_RequestA(app,window,0,'Convertor',0,cat.msgWrongEOF.getstr(),0)
- Close(handler)
- Raise(ER_BADFORMAT)
- ENDIF
-
- IF StrCmp(r,':Groups')
- quit:=TRUE
- ELSE
- nbases++
- NEW bptr
- bases[nbases]:=bptr
- bptr.name:=String(StrLen(r))
- StrCopy(bptr.name,r)
-
- statusu:=ReadStr(handler,r) /*(2)*/
- IF Not(r[]) AND (statusu = -1)
- Mui_RequestA(app,window,0,'Convertor',0,cat.msgWrongEOF.getstr(),0)
- Close(handler)
- Raise(ER_BADFORMAT)
- ENDIF
- IF StrCmp(r,':Bases') OR StrCmp(r,':Groups')
- Mui_RequestA(app,window,0,'Convertor',0,cat.msgWrongTag.getstr(),0)
- Close(handler)
- Raise(ER_BADFORMAT)
- ENDIF
- StrCopy(stri,'$')
- MidStr(nme,r,0,8)
- StrAdd(stri,nme)
- j:=Val(stri)
-
- StrCopy(stri,'$')
- MidStr(nme,r,8,8)
- StrAdd(stri,nme)
- k:=Val(stri)
-
- joinfloat(j,k,bptr.value)
-
- IF StrLen(r) > 18
- StrCopy(stri,'$')
- MidStr(nme,r,16,8)
- StrAdd(stri,nme)
- j:=Val(stri)
-
- StrCopy(stri,'$')
- MidStr(nme,r,24,8)
- StrAdd(stri,nme)
- k:=Val(stri)
-
- joinfloat(j,k,bptr.zero)
- ENDIF
- statusu:=ReadStr(handler,r) /*(3)*/
- IF Not(r[]) AND (statusu = -1)
- Mui_RequestA(app,window,0,'Convertor',0,cat.msgWrongEOF.getstr(),0)
- Close(handler)
- Raise(ER_BADFORMAT)
- ENDIF
- bptr.type:=String(StrLen(r))
- StrCopy(bptr.type,r)
-
- ENDIF
-
- UNTIL quit
- quit:=FALSE
- REPEAT
- statusu:=ReadStr(handler,r)
- var:=r[]
- IF var OR (statusu <> -1)
- gptr:=groups[cur]
- IF StrCmp(r,':Group ',7)
- IF cur > -1 /*Que se passe-t-il sinon?*/
- gptr.sze:=line
- ENDIF
- glen++
- cur++
- NEW gptr
- groups[cur]:=gptr
- gptr.list:=NewR(50*4)
- gptr.title:=String(15)
- ptc:=String(15)
- MidStr(ptc,r,7)
- doMethodA(l_groups,[MUIM_List_InsertSingle,ptc,MUIV_List_Insert_Bottom])
- StrCopy(gptr.title,ptc)
- line:=-1
- ELSE
- line++
- NEW ptr
- ptr.sze:=0
- gptr.list[line]:=ptr
- IF ptr.decode(OP_REPL,r) = FALSE
- END ptr
- line--
- ENDIF
- ENDIF
- ELSE
- quit:=TRUE
- ENDIF
- IF CtrlC()
- Mui_RequestA(app,window,0,'Convertor',0,cat.msgUserAbort.getstr(),0)
- quit:=TRUE
- ENDIF
- UNTIL quit
- Close(handler)
- ELSE
- Raise(ER_NOUD)
- ENDIF
- gptr:=groups[cur]
- gptr.sze:=line
- ->glen++
- /*lvt_groups[glen+1]:=String(6)
- StrCopy(lvt_groups[glen+1],'Base')
- lvt_groups[glen+2]:=NIL*/
- doMethodA(l_groups,[MUIM_List_InsertSingle,cat.msgBase.getstr(),MUIV_List_Insert_Bottom])
- StrCopy(r,silist) /*; ; */ /*DECODAGE DES UNITES SI*/
- z:=-1 /* i->z */
- n:=FALSE
- nsi:=0
- REPEAT
- i:=z+1
- z:=InStr(r,';',i)
- IF z=-1
- z:=StrLen(r)
- n:=TRUE
- ENDIF
- MidStr(stri,r,i,z-i)
- NEW ptr
- IF ptr.decode(OP_REPL,stri) = FALSE
- END ptr
- Raise(ER_BADFORMAT)
- ELSE
- si[nsi++]:=ptr
- ENDIF
- UNTIL n
-
- ENDPROC
- PROC newud(grp,unt)
- DEF ptc:PTR TO CHAR
- nbases:=0
- NEW bptr
- bases[]:=bptr
- bptr.name:=String(StrLen(unt))
- StrCopy(bptr.name,unt)
- dFloat(1,bptr.value)
- dFloat(0,bptr.zero)
- bptr.type:=String(1) /*bases*/
- StrCopy(bptr.type,'O')
- glen:=0
- gptr:=groups[]
- gptr.list:=NewR(50*4)
- gptr.sze:=0
- gptr.title:=String(StrLen(grp))
- StrCopy(gptr.title,grp)
- ptc:=String(StrLen(grp))
- StrCopy(ptc,grp)
- doMethodA(l_groups,[MUIM_List_InsertSingle,ptc,MUIV_List_Insert_Bottom])
- NEW ptr
- gptr.list[]:=ptr /*composées (groupes)*/
- ptr.createsimple(unt)
- doMethodA(l_groups,[MUIM_List_InsertSingle,cat.msgBase.getstr(),MUIV_List_Insert_Bottom])
- nsi:=0
- NEW ptr
- ptr.createsimple(unt) /*Si*/
- si[]:=ptr
- ENDPROC
- /****************************************************
- * *
- * ptr.simple() *
- * *
- * Renvoie TRUE (pas MUI_TRUE!) si ptr est simple: *
- * - Une seule unité de base *
- * - Pas de préfixe *
- * - Pas d'exposant *
- * - Pas inversé *
- * *
- ****************************************************/
-
- PROC simple() OF composed
- IF self.sze <> 0 THEN RETURN FALSE
- IF self.pfx[] <> 20 THEN RETURN FALSE
- IF self.expo[] <> 1 THEN RETURN FALSE
- ENDPROC TRUE
-
- /****************************************************
- * *
- * ptr.createsimple(str) *
- * *
- * Crée une unité composée simple (voir ptr.simple)*
- * formée avec l'unité de base str. *
- * *
- ****************************************************/
-
- PROC createsimple(bs:PTR TO CHAR) OF composed
- NEW self.base;self.base[]:=String(StrLen(bs))
- StrCopy(self.base[],bs)
- NEW self.pfx; self.pfx[]:=20
- NEW self.expo;self.expo[]:=1
- self.sze:=0
- ENDPROC
-
- /****************************************************
- * *
- * StrCopy(ch,ptr.comp2str()) *
- * *
- * convertit ptr en chaîne via str (renvoie aussi *
- * son pointeur) *
- * *
- ****************************************************/
-
- PROC comp2str() OF composed
- DEF j,xp,wrote=FALSE,ds=0,t,found
- StrCopy(str,'')
- FOR j:=0 TO self.sze
- xp:=self.expo[j]
-
- IF xp > 0
- IF wrote
- StrAdd(str,'*')
- ELSE
- wrote:=TRUE
- ENDIF
-
- IF self.pfx[j] <> 20
- StringF(r,'\s\s',pref[self.pfx[j]].name,self.base[j])
- t,found:=findbase(r)
- IF found THEN StringF(r,'\s.\s',pref[self.pfx[j]].name,self.base[j])
- StrAdd(str,r)
- ELSE
- StrAdd(str,self.base[j])
- ENDIF
- IF xp<>1
- StringF(r,'^\d',xp)
- StrAdd(str,r)
- ENDIF
- ELSE
- ds++
- ENDIF
- ENDFOR
- IF wrote=FALSE
- StrCopy(str,'1')
- ENDIF
- IF ds
- wrote:=FALSE
- FOR j:=0 TO self.sze
- xp:=-self.expo[j]
-
- IF xp > 0
- IF wrote=FALSE
- StrAdd(str,'/')
- IF ds > 1
- StrAdd(str,'(')
- ENDIF
- wrote:=TRUE
- ELSE
- StrAdd(str,'*')
- ENDIF
-
- IF self.pfx[j] <> 20
- StringF(r,'\s\s',pref[self.pfx[j]].name,self.base[j])
- StrAdd(str,r)
- ELSE
- StrAdd(str,self.base[j])
- ENDIF
- IF xp<>1
- StringF(r,'^\d',xp)
- StrAdd(str,r)
- ENDIF
- ENDIF
- ENDFOR
- IF ds > 1
- StrAdd(str,')')
- ENDIF
- ENDIF
- ENDPROC str
-
- /****************************************************
- * *
- * ptr.decode(action,ch[,value,[newprefix[, *
- * zero[,type]]]]) *
- * *
- * convertit une E-string (ch) en composed (ptr) *
- * *
- * action :action à effectuer sur l'unité ptr. *
- * OP_MUL,OP_DIV ou OP_REPL. *
- * value:facteur de l'unité (en sortie) *
- * newprefix:Si il faut changer le préfixe, le *
- * mettre ici. *
- * zero:Si non-NIL, reçoit le zéro de l'unité. *
- * type:type de l'unité au format .type (NNO..), *
- * en sortie. *
- * *
- ****************************************************/
-
- PROC decode(action,st,real=NIL:PTR TO longreal,npfx=PFX_ORIGINAL,
- zero=NIL:PTR TO longreal,tpe=NIL:PTR TO CHAR) OF composed
- DEF num,found,work[60]:STRING,pos1,pos2,sze,strl, /*pos1 est le début du mot en cours et pos2 est la fin*/
- j,k,l,inv,linv,w:longreal,v:longreal,bbase:PTR TO LONG,bpfx:PTR TO LONG,bexpo:PTR TO LONG,
- always=FALSE,close=FALSE,locstr[60]:STRING,sPower[20]:ARRAY OF LONG,int:PTR TO CHAR,nilbase,
- msg[50]:STRING
-
- IF tpe
- FOR j:=0 TO 19
- sPower[j]:=0
- ENDFOR
- ENDIF
-
- IF real
- dFloat(1,real)
- ENDIF
-
- IF self.sze AND (action=OP_REPL)
- END self.base
- END self.pfx
- END self.expo
- ENDIF
-
- strl:=StrLen(st)
- j:=strl/2+1
-
- IF action=OP_REPL
- NEW self.base[j+1]
- NEW self.pfx[j+1]
- NEW self.expo[j+1]
- sze:=-1
- ELSE
- sze:=self.sze
- NEW bbase[sze+1];NEW bpfx[sze+1];NEW bexpo[sze+1] /*stockage des données pendant le*/
- /*changement de taille. */
- FOR k:=0 TO sze
- bbase[k]:=self.base[k] /*->tampon*/
- bpfx[k]:=self.pfx[k]
- bexpo[k]:=self.expo[k]
- ENDFOR
- j:=j+sze
- END self.base;END self.pfx;END self.expo /*Change la taille*/
- NEW self.base[j+1];NEW self.pfx[j+1];NEW self.expo[j+1]
-
- FOR k:=0 TO sze
- self.base[k]:=bbase[k]
- self.pfx[k]:=bpfx[k] /*tampon->*/
- self.expo[k]:=bexpo[k]
- IF (real <> NIL) OR (tpe <> NIL) /*Si real n'est pas NIL,...*/
- num,found:=findbase(self.base[k]) /*...On calcule le facteur en passant.*/
- IF found
- bptr:=bases[num]
- IF real <> NIL
- dMul(dPow(dMul( dPow(ten,pref[self.pfx[k]].exp,v), bptr.value, v ),dFloat(self.expo[k],w),w),real,real)
- ENDIF
- IF tpe <> NIL /*Calcul du type*/
- int:=bptr.type
- FOR l:=0 TO StrLen(int)-1
- sPower[l]:=sPower[l]+((int[l]-78)*(self.expo[k]))
- ENDFOR
- ENDIF
- ELSE
- StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),self.base[k],cat.msgLostUnitB.getstr())
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- ENDIF
-
- ENDIF
- ENDFOR
- END bbase;END bpfx;END bexpo /*suppression du tampon*/
- ENDIF
-
- pos1:=0
- inv:=FALSE
-
- REPEAT
-
- linv:=inv;inv:=FALSE
- IF close THEN always:=FALSE
-
- sze++
- pos2:=InStr(st,'*',pos1)
- IF pos2=-1 THEN pos2:=strl+1
- j:=InStr(st,'/',pos1)
-
- IF j<pos2 AND (j<>-1)
- pos2:=j
- inv:=TRUE
- ENDIF
-
- MidStr(locstr,st,pos1,pos2-pos1)
-
- IF InStr(locstr,'(')<>-1
- MidStr(work,locstr,1)
- StrCopy(locstr,work)
- IF linv
- linv:=FALSE
- always:=TRUE
- ENDIF
- ENDIF
-
- IF InStr(locstr,')')<>-1
- MidStr(work,locstr,0,StrLen(locstr)-1)
- StrCopy(locstr,work)
- close:=TRUE
- ENDIF
-
- j:=InStr(locstr,'^')
- IF j <> -1
- MidStr(work,locstr,j+1)
- self.expo[sze]:=Val(work)
- MidStr(work,locstr,0,j)
- StrCopy(locstr,work)
- ELSE
- self.expo[sze]:=1
- ENDIF
-
- IF action=OP_DIV
- self.expo[sze]:=-self.expo[sze]
- ENDIF /*Il faudrait utiliser un Xor...*/
- IF linv+always=TRUE
- self.expo[sze]:=-self.expo[sze]
- ENDIF
-
- IF StrCmp(locstr,'1')
- num:=-1
- bptr:=-1
- sze--
- nilbase:=TRUE
- self.pfx[sze]:=20
- ELSE
- nilbase:=FALSE
- j:=InStr(locstr,'.')
- IF j <> -1 /*on a un point: pf.bs */
- MidStr(work,locstr,0,j)
- FOR k:=0 TO 19
- found:=TRUE
- EXIT StrCmp(work,pref[k].name)
- found:=FALSE
- ENDFOR
- IF found /*bs ne correspond pas*/
- MidStr(work,locstr,j+1)
- self.pfx[sze]:=k
- num,found:=findbase(work)
- bptr:=bases[num]
- IF found /*bs correspond*/
- self.base[sze]:=String(StrLen(work))
- StrCopy(self.base[sze],work)
- ELSE /*pf ne correspond pas*/
- StringF(msg,'\s \s.\n',cat.msgUnknownUnit.getstr(),locstr)
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- self.default()
- RETURN FALSE
- ENDIF
- ELSE /*pf correspond*/
- StringF(msg,'\s \s.',cat.msgUnknownUnit.getstr(),locstr)
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- self.default()
- RETURN FALSE
- ENDIF
- ELSE /*pas de . trouvés*/
- self.pfx[sze]:=20
- num,found:=findbase(locstr)
- bptr:=bases[num]
- IF found=FALSE /*ce n'est pas une base seule*/
- FOR j:=0 TO 19
- found:=TRUE
- EXIT StrCmp(locstr,pref[j].name,1)
- found:=FALSE
- ENDFOR
- IF found
- self.pfx[sze]:=j
- IF j=9
- MidStr(work,locstr,2)
- ELSE
- MidStr(work,locstr,1)
- ENDIF
- num,found:=findbase(work)
- IF found
- self.base[sze]:=String(StrLen(work)) /*pfx + base:ok*/
- StrCopy(self.base[sze],work)
- bptr:=bases[num]
- ELSE /*erreur dans l'unité*/
- StringF(msg,'\s \s.\n',cat.msgUnknownUnit.getstr(),locstr)
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- self.default()
- RETURN FALSE
- ENDIF
- ELSE
- StringF(msg,'\s \s.\n',cat.msgUnknownUnit.getstr(),locstr)
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- self.default()
- RETURN FALSE
- ENDIF
- ELSEIF bptr <> NIL /*c'est une base seule*/
- self.base[sze]:=String(StrLen(locstr))
- StrCopy(self.base[sze],locstr)
- ENDIF
- ENDIF
- ENDIF
-
- IF (tpe <> NIL) AND (nilbase=FALSE)
- int:=bptr.type
- FOR l:=0 TO StrLen(int)-1
- sPower[l]:=sPower[l]+((int[l]-78)*(self.expo[sze]))
- ENDFOR
- ENDIF
-
- IF (npfx<>PFX_ORIGINAL) AND (nilbase=FALSE)
- self.pfx[sze]:=npfx
- npfx:=PFX_ORIGINAL
- ENDIF
-
- IF (real <> NIL) AND (nilbase=FALSE)
- bptr:=bases[num]
- dMul(dPow( dMul(dPow(ten,pref[self.pfx[sze]].exp,v),bptr.value,v),dFloat(self.expo[sze],w),w),real,real)
- ENDIF
- pos1:=pos2+1
- UNTIL pos2>=strl
-
- self.sze:=sze
-
- self.simplify() /*On simplifie*/ /*(Ça serait mieux d'intégrer*/
- /*la simplification au processus de décodage,*/
- IF zero <> NIL /*mais c'est déjà assez buggé comme ça. :-)*/
- IF (sze = 0) AND (self.pfx[]=20) AND (self.expo[]=1) /*Ça pourrait être un niveau...*/
- bptr:=bases[num]
- dCopy(zero,bptr.zero)
- ELSE
- dFloat(0,zero)
- ENDIF
- ENDIF
-
- IF tpe <> NIL
- FOR j:=0 TO 19
- tpe[j]:=sPower[j]+78
- ENDFOR
- ENDIF
-
- ENDPROC TRUE
-
- /****************************************************
- * *
- * ptr.default() *
- * *
- * en cas d'erreur irrécupérable de modification *
- * d'une unité composée (la précédente est donc *
- * perdue), appeller default. (PAS POUR LA *
- * CREATION!!) *
- * *
- ****************************************************/
-
- PROC default() OF composed
- END self
- NEW self
- self.createsimple('m')
- ENDPROC
-
- PROC getinfo(fact:PTR TO longreal,zero:PTR TO longreal,type:PTR TO CHAR) OF composed
- DEF num,found,
- j,k,l,w:longreal,v:longreal,
- sPower[20]:ARRAY OF LONG,int:PTR TO CHAR,
- msg[50]:STRING
- FOR j:=0 TO 19
- sPower[j]:=0
- ENDFOR
- dFloat(1,fact)
- FOR k:=0 TO self.sze
- num,found:=findbase(self.base[k])
- IF found
- bptr:=bases[num]
- dMul(dPow(dMul( dPow(ten,pref[self.pfx[k]].exp,v), bptr.value, v ),dFloat(self.expo[k],w),w),fact,fact)
- int:=bptr.type
- FOR l:=0 TO StrLen(int)-1
- sPower[l]:=sPower[l]+((int[l]-78)*(self.expo[k]))
- ENDFOR
- ELSE
- StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),self.base[k],cat.msgLostUnitB.getstr())
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- ENDIF
- ENDFOR
- IF (self.sze = 0) AND (self.pfx[]=20) AND (self.expo[]=1)
- bptr:=bases[num]
- dCopy(zero,bptr.zero)
- ELSE
- dFloat(0,zero)
- ENDIF
- FOR j:=0 TO 19
- type[j]:=sPower[j]+78
- ENDFOR
- ENDPROC
-
- /****************************************************
- * *
- * ptr.copycomp(source,arg) *
- * *
- * copie l'unité source vers ptr. *
- * Mettre arg a NEWC si ptr est nouveau *
- * *
- ****************************************************/
-
- PROC copycomp(source:PTR TO composed,ar=OLDC) OF composed
- DEF j
- IF ar=OLDC
- END self.pfx[self.sze+1]
- END self.base[self.sze+1]
- END self.expo[self.sze+1]
- ENDIF
- self.pfx:=NewR((source.sze+1)*4)
- self.expo:=NewR((source.sze+1)*4)
- self.base:=NewR((source.sze+1)*4)
-
- self[].sze:=source[].sze
- FOR j:=0 TO source.sze
- self.pfx[j]:=source.pfx[j]
- self.base[j]:=String(StrLen(source.base[j]))
- StrCopy(self.base[j],source.base[j])
- self.expo[j]:=source.expo[j]
- ENDFOR
- ENDPROC
-
- /****************************************************
- * *
- * ptr.simplify() *
- * *
- * Simplifie l'unité (m*m->m^2 et m*s/s->m) *
- * *
- ****************************************************/
-
- PROC simplify() OF composed
- DEF j,k,l,found=-1,ok
- /*j: Element en cours (LECTURE UNIQUEMENT!)*/
- FOR j:=0 TO self.sze /*k: Element de comparaison (dont on va changer l'exposant*/
- IF found <> -1 /*l: Element de destination pour le scrolling*/
- ok:=FALSE /*found: Dernier element "final"*/
- FOR k:=0 TO found
- IF StrCmp(self.base[j],self.base[k]) AND (self.pfx[j]=self.pfx[k]) -> l'elem. j correspond au k déja vu.
- ok:=TRUE
- self.expo[k]:=self.expo[k]+self.expo[j] ->On ajoute les exposants
- IF self.expo[k]=0 -> par exemple: m/m
- FOR l:=k TO found-1
- self.base[l]:=self.base[l+1]
- self.expo[l]:=self.expo[l+1]
- self.pfx[l]:=self.pfx[l+1]
- ENDFOR
- found--
- ENDIF
- ENDIF
- ENDFOR
- IF ok=FALSE ->on a rien trouvé, il va falloir en créer un nouveau...
- found++
- IF found<>j
- self.base[found]:=self.base[j]
- self.expo[found]:=self.expo[j]
- self.pfx[found]:=self.pfx[j]
- ENDIF
- ENDIF
- ELSE
- found:=0 ->Au début, le premier élément ne bronche pas.
- ENDIF
- ENDFOR
-
- self.sze:=found
-
- ENDPROC
-
- /****************************************************
- * *
- * ptr.inverse(type) *
- * *
- * Inverse l'unité (ptr:=1/ptr) *
- * *
- * type:type de l'unité (entrée et sortie) *
- * *
- ****************************************************/
-
- PROC inverse(tpe) OF composed
- DEF j
- FOR j:=0 TO self.sze
- self.expo[j]:=-self.expo[j]
- ENDFOR
- FOR j:=0 TO 19
- tpe[j]:=156-tpe[j]
- ENDFOR
- ENDPROC
-
- /****************************************************
- * *
- * ptr.siConvert(value) *
- * *
- * Pour convertir value_ptr dans son équivalent SI *
- * ptr et value sont modifiés. *
- * *
- ****************************************************/
-
- PROC siConvert(value:PTR TO longreal) OF composed
- DEF found,j,k,l,sPower[20]:ARRAY OF LONG,compBuf:PTR TO composed,sze,int:PTR TO CHAR,
- v:longreal,w:longreal,msg[50]:STRING
-
- dFloat(1,t)
-
- NEW compBuf
-
- FOR j:=0 TO 19
- sPower[j]:=0
- ENDFOR
- FOR j:=0 TO self.sze /*j contient le numéro de la 'powerbase' de self*/
- k,found:=findbase(self.base[j])
- bptr:=bases[k] /*k contient le numéro de l'unité de base utilisée */
- IF found=FALSE
- StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),self.base[j],cat.msgLostUnitB.getstr())
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- RETURN
- ENDIF
- int:=bptr.type
- FOR l:=0 TO StrLen(bptr.type)-1
- sPower[l]:=sPower[l]+((int[l]-78)*(self.expo[j]))
- ENDFOR
- dMul(value,dPow(dMul( dPow(ten,pref[self.pfx[j]].exp,v), bptr.value, v ),dFloat(self.expo[j],w),w))
- ENDFOR
- NEW compBuf.base[20]
- NEW compBuf.pfx[20]
- NEW compBuf.expo[20]
- sze:=-1
- FOR j:=0 TO 19 /*sze contient le numéro de la 'powerbase' de compBuf*/
- IF sPower[j]<>0
- sze++
- ptr:=si[j]
- compBuf.base[sze]:=ptr.base[]
- compBuf.pfx[sze]:=ptr.pfx[]
- compBuf.expo[sze]:=sPower[j]
- k,found:=findbase(ptr.base[])
- bptr:=bases[k] /*k contient le numéro de l'unité de base utilisée */
- IF found=FALSE
- StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),ptr.base[],cat.msgLostUnitB.getstr())
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- RETURN
- ENDIF
- dMul(t,dPow(dMul( dPow(ten,pref[compBuf.pfx[sze]].exp,v),bptr.value, v ),dFloat(compBuf.expo[sze],w),w))
- ENDIF
- ENDFOR
- compBuf.sze:=sze
- END self
- NEW self
- NEW self.base[sze+1]
- NEW self.pfx[sze+1]
- NEW self.expo[sze+1]
-
- self.copycomp(compBuf)
-
- END compBuf
- dMul(value,t)
- ENDPROC t
-
- /****************************************************
- * *
- * END ptr *
- * *
- * Destructeur de la classe composed *
- * *
- ****************************************************/
-
- PROC end() OF composed
- END self.base[self.sze+1]
- END self.pfx[self.sze+1]
- END self.expo[self.sze+1]
- ENDPROC
-
- PROC readu(rgt=FALSE)
- mget(bt_a,MUIA_Selected,{z})
- IF z=MUI_TRUE
- z:=OP_MUL
- ELSE
- mget(bt_b,MUIA_Selected,{z})
- IF z=MUI_TRUE
- z:=OP_DIV
- ELSE
- z:=OP_REPL /*i=préfixe*/
- ENDIF /*q=chaîne*/
- ENDIF
-
- mget(l_pfx,MUIA_List_Active,{i})
- doMethodA(l_units,[MUIM_List_GetEntry,MUIV_List_GetEntry_Active,{q}])
-
- IF rgt
- IF i = 10 -> Original
- IF unit2.decode(z,q,t,PFX_ORIGINAL,zero2,type2) = FALSE
- Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
- RETURN
- ENDIF
- IF z<>OP_REPL
- StrCopy(r,unit2.comp2str())
- ELSE
- StrCopy(r,q)
- ENDIF
- ELSE -> Remplace le préfixe
- IF i = 11
- i:=20
- ELSEIF i > 11
- i:=i-2
- ENDIF
- IF unit2.decode(z,q,t,i,zero2,type2) = FALSE
- Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
- RETURN -> JUMP out -> See below :-)
- ENDIF
- StrCopy(r,unit2.comp2str())
- ENDIF
- set(ud,MUIA_String_Contents,r)
- dCopy(fact2,t)
- ELSE
- IF i = 10 -> Original
- IF unit1.decode(z,q,t,PFX_ORIGINAL,zero1,type1) = FALSE
- Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
- RETURN -> JUMP out -> Eeeek!
- ENDIF
- IF z<>OP_REPL
- StrCopy(r,unit1.comp2str())
- ELSE
- StrCopy(r,q)
- ENDIF
- ELSE -> Remplace le préfixe
- IF i = 11
- i:=20
- ELSEIF i > 11
- i:=i-2
- ENDIF
- IF unit1.decode(z,q,t,i,zero1,type1) = FALSE
- Mui_RequestA(app,window,0,cat.msgInternalFailureT.getstr(),NIL,cat.msgInternalFailure.getstr(),NIL)
- RETURN -> JUMP out -> Aargh!
- ENDIF
- StrCopy(r,unit1.comp2str())
- ENDIF
- set(ug,MUIA_String_Contents,r)
- dCopy(fact1,t)
- ENDIF
- chkzero()
- set(l_pfx,MUIA_List_Active,10)
- ENDPROC
-
- PROC replace(list,item,replacement:PTR TO CHAR)
- point:=String(StrLen(replacement))
- StrCopy(point,replacement)
- set(list,MUIA_List_Quiet,MUI_TRUE)
- doMethodA(list,[MUIM_List_Remove,item])
- doMethodA(list,[MUIM_List_InsertSingle,point,item])
- set(list,MUIA_List_Quiet,FALSE)
- ENDPROC
-
- PROC askstr(title,default,mode)
- mode:=NIL
- /* SELECT mode
- CASE BASE
- set(strstr,MUIA_String_Accept,NIL)
- set(strstr,MUIA_String_Reject,'/.*"()^ ')
- CASE NUMERIC
- set(strstr,MUIA_String_Accept,'0123456789.Ee')
- set(strstr,MUIA_String_Reject,NIL)
- CASE COMPOSED
- set(strstr,MUIA_String_Accept,NIL)
- set(strstr,MUIA_String_Reject,NIL)
- CASE GROUP
- set(strstr,MUIA_String_Accept,NIL)
- set(strstr,MUIA_String_Reject,NIL)
- ENDSELECT */
- set(strwin,MUIA_Window_Title,title)
- set(strstr,MUIA_String_Contents,default)
- set(strwin,MUIA_Window_Open,MUI_TRUE)
- ENDPROC
-
- PROC addcomp(group,unit:PTR TO composed,pos)
- DEF /*cont:PTR TO group,*/old,list:PTR TO LONG,j,tempstr:PTR TO CHAR,myptr:PTR TO composed
-
-
- cont:=groups[group]
-
- list:=NewR((cont.sze+2)*4)
- IF pos <> 0
- FOR i:=0 TO pos-1
- list[i]:=cont.list[i]
- ENDFOR
- ENDIF
- NEW myptr
- list[pos]:=myptr
- myptr.copycomp(unit,NEWC)
- IF pos <> (cont.sze+1)
- FOR i:=pos TO cont.sze
- list[i+1]:=cont.list[i]
- ENDFOR
- ENDIF
-
- old:=cont.list
- END old[cont.sze+1]
- cont.list:=list
- cont.sze:=cont.sze+1
-
- mget(l_groups,MUIA_List_Active,{j})
- IF j=group
- nunits++
- unit.comp2str()
- tempstr:=String(EstrLen(str))
- StrCopy(tempstr,str)
- doMethodA(l_units,[MUIM_List_InsertSingle,tempstr,pos])
- set(l_units,MUIA_List_Active,pos)
- ENDIF
- ENDPROC
-
- PROC delcomp(grpn,unitn)
- DEF cc:PTR TO composed,j
- gptr:=groups[grpn]
- IF gptr.sze=0
- IF glen=0
- bip()
- RETURN FALSE
- ENDIF
- doMethodA(l_groups,[MUIM_List_Remove,grpn])
- FOR j:=grpn TO glen-1
- groups[j]:=groups[j+1]
- ENDFOR
- glen--
- _returnid(ID_OPENG)
- RETURN TRUE
- ELSE
- cc:=gptr.list[unitn]
- END cc
- IF unitn <> gptr.sze
- FOR j:=unitn TO gptr.sze-1
- gptr.list[j]:=gptr.list[j+1]
- ENDFOR
- ENDIF
- gptr.sze:=gptr.sze-1
- ENDIF
- ENDPROC FALSE
-
- /****************************************************
- * *
- * success:=addbase(value,composed,name[,pos]) *
- * *
- * Ajoute une unité de base à la position pos (à *
- * la fin si non précisé), équivalente à value *
- * composed; avec le nom name. *
- * *
- ****************************************************/
-
- PROC addbase(value:PTR TO longreal,composed:PTR TO composed,name:PTR TO CHAR,pos=-1)
- DEF /*list:PTR TO LONG,*/bb:PTR TO base,real:longreal,
- j,found,v:longreal,w:longreal
- DEF k,l,sPower[20]:ARRAY OF LONG,int:PTR TO CHAR,dint:PTR TO CHAR,msg[50]:STRING
- IF dCompare(value,dFloat(0,v))=0
- Mui_RequestA(app,window,0,cat.msgNoZeroBaseT.getstr(),cat.msgAbort.getstr(),cat.msgNoZeroBase.getstr(),NIL)
- RETURN FALSE
- ENDIF
- /*RECHERCHE DE .type*/
- NEW bb
- bb.name:=String(StrLen(name))
- StrCopy(bb.name,name)
- dCopy(real,value) /*CALCUL DE .value*/
- FOR j:=0 TO 19
- sPower[j]:=0
- ENDFOR
- IF composed > 0 -> Si composed est négatif, c'est une nouvelle unité (SI n° -composed )
- FOR j:=0 TO composed.sze /*j contient le numéro de la "powerbase" de composed*/
- k,found:=findbase(composed.base[j]) /*k contient le numéro de l'unité de base utilisée */
- IF found
- bptr:=bases[k]
- int:=bptr.type
- FOR l:=0 TO StrLen(bptr.type)-1
- sPower[l]:=sPower[l]+((int[l]-78)*(composed.expo[j]))
- ENDFOR
- dMul(dPow(dMul( dPow(ten,pref[composed.pfx[j]].exp,v), bptr.value, v ),dFloat(composed.expo[j],w),w),real,real)
- ELSE
- StringF(msg,'\s \s \s',cat.msgLostUnitA.getstr(),composed.base[j],cat.msgLostUnitB.getstr())
- Mui_RequestA(app,window,0,cat.msgUnitNotFound.getstr(),NIL,msg,NIL)
- ENDIF
- ENDFOR
- ELSE
- sPower[-composed]:=1
- ENDIF
- dCopy(bb.value,real)
- dFloat(0,bb.zero)
- NEW dint[21]
- FOR j:=0 TO 19
- dint[j]:=sPower[j]+78
- ENDFOR
- dint[20]:=NIL -> Pour être une chaîne correcte!
-
- bb.type:= dint
-
- a:=String(StrLen(name))
- StrCopy(a,name)
- IF pos=-1 OR (pos = (nbases+1))
- nbases++
- bases[nbases]:=bb
- IF basegroup
- doMethodA(l_units,[MUIM_List_InsertSingle,a,MUIV_List_Insert_Bottom])
- ENDIF
- ELSE
- /*De nbases+1 -> pos+1*/
- j:=nbases+1
- REPEAT
- bases[j]:=bases[j-1]
- j--
- UNTIL j=pos
- bases[pos]:=bb
- IF basegroup
- doMethodA(l_units,[MUIM_List_InsertSingle,a,pos])
- ENDIF
- nbases++
- ENDIF
- ENDPROC TRUE
-
- PROC delbase(basn)
- DEF cc:PTR TO base,j
- IF nbases > 1
- cc:=bases[basn]
- END cc
- IF basn <> nbases
- FOR j:=basn TO nbases-1
- bases[j]:=bases[j+1]
- ENDFOR
- ENDIF
- nbases--
- ELSE
- Mui_RequestA(app,window,0,cat.msgCancel.getstr(),0,cat.msgOneBase.getstr(),0)
- ENDIF
- ENDPROC
-
- PROC gsort()
- DEF results:PTR TO LONG,todo:PTR TO LONG,big,small,
- j,k,len,g1:PTR TO group,g2:PTR TO group,g3:PTR TO group,b,s,first
- /*big et small sont des n° de list (groups)*/
- NEW results[glen+1] /*todo[x] sont des n° de list (groups) aussi*/
- NEW todo[glen+1]
-
- FOR j:=0 TO glen
- todo[j]:=j
- ENDFOR
-
- len:=glen -> n° du dernier elem de ToDo
-
-
- WHILE len > -1
- b:=1;s:=1
- k:=0
- first:=todo[]
- big:=first
- small:=first /*k contient le n° du dernier echappé*/
- FOR j:=1 TO len
- g1:=groups[big] /*j contient le n° du prochain todo à mettre*/
- g2:=groups[todo[j]]
- g3:=groups[small]
- IF strord(g1.title,g2.title)=-1
- IF (b=0)
- todo[k++]:=big /*on a trouvé un "meilleur" big*/
- ELSE
- b:=0
- ENDIF
- big:=todo[j]
- ELSEIF strord(g3.title,g2.title)=1
- IF (s=0)
- todo[k++]:=small
- ELSE
- s:=0
- ENDIF
- small:=todo[j] /*on a trouvé un "meilleur" small*/
- ELSE
- todo[k++]:=todo[j] /*j n'a servi a rien*/
- ENDIF
-
- ENDFOR
- IF (b=0) AND (s=0) /*first n'a pas été élu*/
- todo[k++]:=first
- ENDIF
- results[(glen-len)/2]:=groups[small]
- results[glen-((glen-len)/2)]:=groups[big]
- len:=len-2
- ENDWHILE
- IF len=1
- results[(glen+1)/2]:=todo[]
- ENDIF
- FOR j:=0 TO glen
- groups[j]:=results[j]
- ENDFOR
- END results[glen+1]
- END todo[glen+1]
- ENDPROC
-
- PROC comparebase(order,f:PTR TO base,s:PTR TO base)
- DEF msg:PTR TO CHAR
- IF order=SR_ALPHA
- RETURN strord(f.name,s.name)
- ELSEIF order=SR_NUMERIC
- RETURN dCompare(f.value,s.value)
- ELSE
- msg:=String(50)
- StringF(msg,'\s \d',cat.msgUnknowncomp.getstr(),order)
- Mui_RequestA(app,window,0,cat.msgSort.getstr(),NIL,msg,NIL)
- ENDIF
- ENDPROC
-
- PROC bsort(order)
- DEF results:PTR TO LONG,todo:PTR TO LONG,big,small,
- j,k,len,g1:PTR TO base,g2:PTR TO base,g3:PTR TO base,b,s,first
- NEW results[nbases+1] /*big et small sont des n° de list (bases)*/
- NEW todo[nbases+1] /*todo[x] sont des n° de list (bases) aussi*/
-
- FOR j:=0 TO nbases
- todo[j]:=j
- ENDFOR
-
- len:=nbases -> n° du dernier elem de ToDo
-
- WHILE len > -1
- b:=1;s:=1
- k:=0
- first:=todo[]
- big:=first
- small:=first /*k contient le n° du dernier echappé*/
- FOR j:=1 TO len
- g1:=bases[big] /*j contient le n° du prochain todo à mettre*/
- g2:=bases[todo[j]]
- g3:=bases[small]
- IF comparebase(order,g1,g2)=-1
- IF (b=0)
- todo[k++]:=big /*on a trouvé un "meilleur" big*/
- ELSE
- b:=0
- ENDIF
- big:=todo[j]
- ELSEIF comparebase(order,g3,g2)=1
- IF (s=0)
- todo[k++]:=small
- ELSE
- s:=0
- ENDIF
- small:=todo[j] /*on a trouvé un "meilleur" small*/
- ELSE
- todo[k++]:=todo[j] /*j n'a servi a rien*/
- ENDIF
-
- ENDFOR
- IF (b=0) AND (s=0) /*first n'a pas été élu*/
- todo[k++]:=first
- ENDIF
- results[(nbases-len)/2]:=bases[small]
- results[nbases-((nbases-len)/2)]:=bases[big]
- len:=len-2
- ENDWHILE
- IF len=1
- results[(nbases+1)/2]:=todo[]
- ENDIF
- FOR j:=0 TO nbases
- bases[j]:=results[j]
- ENDFOR
- ENDPROC
-
- PROC comparecomp(order,f:PTR TO composed,s:PTR TO composed,reals:PTR TO longreal,j,k)
- DEF t[15]:STRING,u[15]:STRING,msg:PTR TO CHAR
- IF order=SR_ALPHA
- StrCopy(t,f.comp2str())
- StrCopy(u,s.comp2str())
- RETURN strord(t,u)
- ELSEIF order=SR_NUMERIC
- RETURN dCompare(reals[j],reals[k])
- ELSE
- msg:=String(50)
- StringF(msg,'\s \d',cat.msgUnknowncomp.getstr(),order)
- Mui_RequestA(app,window,0,cat.msgSort.getstr(),NIL,msg,NIL)
- ENDIF
- ENDPROC
-
- PROC csort(order,grp)
- DEF results:PTR TO LONG,todo:PTR TO LONG,big,small,v:longreal,w:longreal,
- j,k,l,len,g1:PTR TO base,g2:PTR TO composed,g3:PTR TO composed,b,s,first,parent:PTR TO LONG,sz,reals:PTR TO longreal
-
- gptr:=groups[grp]
- parent:=gptr.list;sz:=gptr.sze
- NEW results[sz+1] /*big et small sont des n° de list (parent)*/
- NEW todo[sz+1] /*todo[x] sont des n° de list (parent) aussi*/
- IF order=SR_NUMERIC
- NEW reals[sz+1]
- FOR j:=0 TO sz
- dFloat(1,reals[j])
- ptr:=parent[j]
- FOR k:=0 TO ptr.sze
- l:=findbase(ptr.base[k])
- bptr:=bases[l]
- dMul(dPow(dMul( dPow(ten,pref[ptr.pfx[k]].exp,v), bptr.value, v ),dFloat(ptr.expo[k],w),w),reals[j],reals[j])
- ENDFOR
- ENDFOR
- ENDIF
-
- FOR j:=0 TO sz
- todo[j]:=j
- ENDFOR
-
- len:=sz -> n° du dernier elem de ToDo
-
- WHILE len > -1
- b:=1;s:=1
- k:=0
- first:=todo[]
- big:=first
- small:=first /*k contient le n° du dernier echappé*/
- FOR j:=1 TO len
- g1:=parent[big] /*j contient le n° du prochain todo à mettre*/
- g2:=parent[todo[j]]
- g3:=parent[small]
- IF comparecomp(order,g1,g2,reals,big,todo[j])=-1
- IF (b=0)
- todo[k++]:=big /*on a trouvé un "meilleur" big*/
- ELSE
- b:=0
- ENDIF
- big:=todo[j]
- ELSEIF comparecomp(order,g3,g2,reals,small,todo[j])=1
- IF (s=0)
- todo[k++]:=small
- ELSE
- s:=0
- ENDIF
- small:=todo[j] /*on a trouvé un "meilleur" small*/
- ELSE
- todo[k++]:=todo[j] /*j n'a servi a rien*/
- ENDIF
-
- ENDFOR
- IF (b=0) AND (s=0) /*first n'a pas été élu*/
- todo[k++]:=first
- ENDIF
- results[(sz-len)/2]:=parent[small]
- results[sz-((sz-len)/2)]:=parent[big]
- len:=len-2
- ENDWHILE
-
- IF len=1
- results[(sz+1)/2]:=todo[]
- ENDIF
-
- FOR j:=0 TO sz
- parent[j]:=results[j] /*ON DOIT POUVOIR OPTIMISER ÇA*/
- ENDFOR
-
- /*END parent[sz+1]
- parent:=results*/
- ENDPROC
-
- PROC strord(a:PTR TO CHAR,b:PTR TO CHAR) /*si a vient avant b, RETURN -1*/
- DEF j,k /*si a vient après b, RETURN 1*/
- k:=Min(StrLen(a),StrLen(b)) /*si StrCmp(a,b), RETURN 0*/
- FOR j:=0 TO k-1
- EXIT a[j] <> b[j]
- ENDFOR
- IF a[j] < b[j] THEN RETURN -1 ->abc < adc
- IF a[j] > b[j] THEN RETURN 1 ->adc > abc
- IF StrLen(a) < StrLen(b) THEN RETURN -1 ->abc < abcd
- IF StrLen(a) > StrLen(b) THEN RETURN 1 ->abcd > abc
- ENDPROC 0 ->abc = abc
-
- PROC findbase(s)
- DEF bp:PTR TO base,n,found /* n[,found]:=findbase(str) */
- FOR n:=0 TO nbases
- bp:=bases[n]
- found:=TRUE
- EXIT StrCmp(s,bp.name)
- found:=FALSE
- ENDFOR
- ENDPROC n,found
-